在.NET中获取原始(非分裂)命令行
在.NET中,我们可以从Main(string[])
或Environment.GetCommandLineArgs()
的参数轻松访问字符串数组中的split命令行参数。 但是,有没有办法将未解析的命令行作为一个字符串?
背景:我的应用程序将自己添加到FileExplorer上下文菜单(如Notepad ++)。 当它以这种方式启动时,文件名将在没有引用的情况下传入,这意味着如果路径中有空格,则会将其分解。 我知道我可以通过在注册表中使用引号中的%1
来修复此问题,例如myapp.exe "%1"
,但是当我检查其他应用程序的注册表时,他们没有这样做。 它们很像notepad.exe %1
– 它们获得了完整的命令行。 我想知道它是否可能在.NET中以及如何实现。
尝试使用Environment.CommandLine
尝试:
Environment.CommandLine
这最好使它达到30个字符。
要获取未解析的原始未修改命令行,您必须从kernel32 P / Invoke GetCommandLine 。 一些解析将由操作系统进行。 例如,无论使用何种技术,都将从命令行文本中排除IO重定向(例如>foo.txt
。
Environment.CommandLine可能就足够了,但请注意它删除了参数之间的间隙空格(除非参数本身用引号括起来)并且它从引用的参数中删除引号。
例如,对于命令行:
test.exe this is "a test"
Environment.CommandLine等于:“ this is a test
”
但GetCommandLine产生:“ test.exe this is "a test"
”,空格和引号完整,以及exe的路径。
请注意 ,使用此技术时,必须手动解析命令行文本,这可能涉及剥离exe的路径,如果路径包含空格,则本身可以用引号括起来。