c# - 如何使用 argv 在 C# 中启动子进程? (或将 agrv 转换为合法的 arg 字符串)

标签 c# shell mono subprocess argv

我有一个 C# 命令行应用程序,我需要在 Windows 和 Unix 的单声道下运行。在某些时候,我想在给定一组通过命令行传入的任意参数的情况下启动一个子进程。例如:

Usage: mycommandline [-args] -- [arbitrary program]

不幸的是,System.Diagnostics.ProcessStartInfo 只接受一个字符串作为参数。这是命令的问题,例如:

./my_commandline myarg1 myarg2 -- grep "a b c" foo.txt

在这种情况下 argv 看起来像:

argv = {"my_commandline", "myarg1", "myarg2", "--", "grep", "a b c", "foo.txt"}

请注意,“a b c”周围的引号已被 shell 剥离,因此如果我简单地连接参数以便为 ProcessStartInfo 创建 arg 字符串,我将得到:

args = "my_commandline myarg1 myarg2 -- grep a b c foo.txt"

这不是我想要的。

有没有一种简单的方法可以将 argv 传递给 C# 下的子进程启动,或者将任意 argv 转换为对 windows 和 linux shell 合法的字符串?

如有任何帮助,我们将不胜感激。

最佳答案

MSDN 有一个描述 how the MS Visual C Runtime parses the stringGetCommandLine() 返回放入 argv 数组。

您可能还对 list2cmdline() 感兴趣来自 Python 标准库的函数,Python 的 subprocess 模块使用它来模拟 Win32 环境中的 Unix argv 行为。

关于c# - 如何使用 argv 在 C# 中启动子进程? (或将 agrv 转换为合法的 arg 字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2960103/

相关文章:

c# - SetTimeZoneInformation 不会更新另一个 .NET 应用程序的 DateTime.Now

c# - 为什么不能直接在外部调用公共(public)事件?

python - 如何通过 python (boto for AWS) 在交互式 shell 中运行命令

linux - shell脚本将数组的值赋给变量

c# - 在单声道中加密 web.config 的配置部分

mono - 构建 Mono 本身的 .deb 包

c# - 我可以使用自动映射器将多个对象映射到目标对象吗

c# - 可能是Visual Studio 2015中的C#编译器错误

linux - 我怎样才能 'pad out' bash 中的 CSV 文件?

c# - XmlPreloadedResolver 上的 Mono TypeLoadException