微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何获得原始的命令行参数

我需要将命令行参数从A.exe传递给B.exe。 如果A.exe有多个参数就好

A.exe -a="a" -b="b"'

我可以使用

BeginProcess("B.exe",**args!**)

ICorProfilerCallback2:CLR分析器不logging所有离开呼叫

Ruby win32ole – 如何传递VARIANT参数?

获取对话框中的文本

抓住Windowsterminalclosures正在运行的进程

什么是Windows的os.loadavg()的替代

启动B.exe。 我怎样才能得到原始的命令行参数

'-a="a" -b="b"'

EnumDesktopWindows(C ++)大约需要30分钟才能在Windows 10上find所需的打开窗口

如何在源代码中设置执行程序的优先级?

用于Windows的NFC C#库

如何找出path是否指定了实际的文件

有关pipe道的基本问题

如果您在Windows上,则使用GetCommandLine获取原始命令行。

请注意,GetCommandLine也包含argv [0]。 所以你必须超越从GetCommandLine的输出argv [0]之前传递给B.

这是一些非错误检查的代码来做到这一点

#include <string.h> #include <windows.h> #include <iostream> #include <ctype.h> int main(int argc,char **argv) { LPTSTR cmd = GetCommandLine(); int l = strlen(argv[0]); if(cmd == strstr(cmd,argv[0])) { cmd = cmd + l; while(*cmd && isspace(*cmd)) ++cmd; } std::cout<<"Command Line is : "<<cmd; }

当我运行上述程序为A.exe -a="a" -b="b" ,我得到以下输出

A.exe -a="a" -b="b" Command Line is : -a="a" -b="b"

以下是基于Wine的CommandLinetoArgvW实现跳过可执行文件名称的唯一正确方法

char *s = lpCmdline; if (*s == '"') { ++s; while (*s) if (*s++ == '"') break; } else { while (*s && *s != ' ' && *s != 't') ++s; } /* (optionally) skip spaces preceding the first argument */ while (*s == ' ' || *s == 't') s++;

main的标准定义是

int main(int argc,char* argv[])

argv变量包含命令行参数。 argc变量表示使用argv数组中的条目数。

输入shell的原始字符串在程序开始运行之前由shell转换为argv 。 我从来没有听说过除了argv之外还提供“原始”命令行的操作系统或shell。

如果用户使用引号将空格字符传递给您的参数呢? 如果他们使用反斜杠来避免引号内的引用呢? 不同的壳可能有不同的引用规则。

如果你有一个像argv这样的列表,你应该尝试找到一个接受的API,而不是试图实现字符串处理,这只是实际目标的辅助。 微软对于安全性非常认真,他们肯定会提供一些不需要在应用程序中增加安全漏洞的东西。

我找不到有关任何C / C ++ API BeginProcess文档; 我有点认为这是Windows,但在任何情况下,你应该仔细检查你的平台的参考手册的替代系统调用

这就是我如何将命令行转换回shell参数。 某些时候,这很好地回显到输出文件,以保存“使用哪些参数”以及输出。 逃跑是基本的,对于大多数情况是足够的。

我在命令(i = 0)开始输出。 如果只有参数,您可以更改为(i = 1)等。

//you have to free() the result!,returns null if no args char *arg2cmd(int argc,char** argv) { char *buf=NULL; int n = 0; int k,i; for (i=0; i <argc;++i) { int k=strlen(argv[i]); buf=( char *)realloc(buf,n+k+4); char *p=buf+n; char endq=0; // this is a poor mans quoting,which is good enough for anything that's not rediculous if (strchr(argv[i],' ')) { if (!strchr(argv[i],''')) { *p++='''; endq='''; } else { *p++='"'; endq='"'; } } memcpy(p,argv[i],k); p+=k; if (i < (argc-1)) *p++=' '; if (endq) *p++=endq; *p=''; n = p-buf; } return buf; }

一个简单的CPP包装:

std::string arg2string(int argc,char **argv) { char *tmp=arg2cmd(argc,argv); std::string ret=tmp; free(tmp); return ret; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐