在.NET中获取原始(非分裂)命令行

NS.*_*.X. 17 .net c# command-line-arguments

在.NET中,我们可以从Main(string[])或的参数中轻松访问字符串数组中的split命令行参数Environment.GetCommandLineArgs().但是,有没有办法将未解析的命令行作为一个字符串?

背景:我的应用程序将自己添加到FileExplorer上下文菜单(如Notepad ++).当它以这种方式启动时,文件名将在没有引用的情况下传入,这意味着如果路径中有空格,则会将其分解.我知道我可以通过%1在注册表中包含引号来解决这个问题myapp.exe "%1",但是当我检查其他应用程序的注册表时,他们没有这样做.他们很平常notepad.exe %1- 他们得到了完整的命令行.我想知道它是否可能在.NET中以及如何实现.

小智 23

尝试使用Environment.CommandLine

  • 有没有办法从这个容易删除可执行文件名? (3认同)

car*_*666 7

尝试:

Environment.CommandLine

这最好使它达到30个字符.


Wyc*_*yck 6

要获得未解析的、原始的、未修改的命令行,您必须从 kernel32 P/Invoke GetCommandLine。一些解析将由操作系统进行。例如,>foo.txt无论使用何种技术,诸如此类的 IO 重定向都将从命令行文本中排除。

Environment.CommandLine 可能就足够了,但请注意,它会删除参数之间的间隙(除非参数本身包含在引号中)并从带引号的参数中删除引号。

例如,对于命令行:

test.exe this is "a test"

Environment.CommandLine 等于:“ this is a test

但是 GetCommandLine 产生:“ test.exe this is "a test"”,空格和引号完好无损,以及 exe 的路径。

请注意,使用此技术时,您必须手动解析命令行文本,这可能涉及剥离 exe 的路径,如果路径包含空格,则该路径本身可能用引号引起来。