在 .NET 中获取原始(未拆分)命令行
Posted
技术标签:
【中文标题】在 .NET 中获取原始(未拆分)命令行【英文标题】:Getting raw (unsplit) command line in .NET 【发布时间】:2012-06-05 00:23:17 【问题描述】:在 .NET 中,我们可以轻松地从 Main(string[])
或 Environment.GetCommandLineArgs()
的参数访问字符串数组中的拆分命令行参数。但是,有没有办法将未解析的命令行作为一个字符串获取?
背景:我的应用程序正在将自身添加到 FileExplorer 上下文菜单中(就像 Notepad++ 一样)。当它以这种方式启动时,文件名不带引号传入,这意味着如果路径中有空格,它就会被分解。我知道我可以通过在myapp.exe "%1"
等注册表中的引号中包含%1
来解决此问题,但是当我检查其他应用程序的注册表时,他们没有这样做。它们就像notepad.exe %1
一样简单——它们拥有完整的命令行。我想知道在 .NET 中是否可行以及如何实现。
【问题讨论】:
【参考方案1】:尝试使用:Environment.CommandLine
【讨论】:
有没有办法轻松删除可执行文件名? @JaredBeach, .Replace(Application.ExecutablePath, "") @JaredBeach How to remove the exe part of the command line. 顺便说一句,Environment.CommandLine
不是原始命令行——它在传递给控制台应用程序之前已经过处理。详情见***.com/questions/65582647/…【参考方案2】:
要获得未解析的、原始的、未修改的命令行,您必须从 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 的路径,如果路径包含空格,则它本身可能用引号引起来.
【讨论】:
呵呵,不要表现出你描述的行为。在我尝试的所有情况下,Environment.CommandLine
都与 PInvoke
匹配。
我也从 Environment.CommandLine
获得了与 .NET 4.5.2 中的 PInvoke 相同的结果。
你是对的。在我当前的系统设置中,两者都给出了相同的结果。我还没有找到我用来测试它的示例应用程序和系统(那是一年前的事),但如果它曾经被破坏,它一定来自一个比今天更旧的 OS+.NET+Compiler 版本集。例如,这可能仅适用于较旧的 VS 更新。不确定是哪个版本。当我有机会时,我会尝试找出我使用的版本。无论如何,你是对的,它在当前软件中并不明显。也许在某个时候修复了错误?我不能断定在某些时候这不是真的。谢谢。
我可以使用命令dotnet run p1=123 p2="one two"
重现差异。它转换为:dotnet run p1=123 "p2=one two"
.以上是关于在 .NET 中获取原始(未拆分)命令行的主要内容,如果未能解决你的问题,请参考以下文章
通过命令行构建 .NET Core 应用程序,使其可以在未安装 .NET Core 的机器上运行