在 .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 中获取原始(未拆分)命令行的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分(不解析)到命令行参数 C# [重复]

通过命令行构建 .NET Core 应用程序,使其可以在未安装 .NET Core 的机器上运行

如何使用命令行从私有 github 存储库下载单个原始文件?

(不仅需要会使用svn,也要会使用git命令行)

在命令行工具中获取资源路径

从 Perl 脚本执行 .net 命令行应用程序