干净地将参数列表传递给 ProcessStartInfo
Posted
技术标签:
【中文标题】干净地将参数列表传递给 ProcessStartInfo【英文标题】:Cleanly passing a list of arguments to ProcessStartInfo 【发布时间】:2021-12-31 05:54:12 【问题描述】:在新程序中以string[]
接收参数。它们已经被正确解析,因此引号会将参数保持在一起,即使它可能是包含空格的路径。不错。
我现在想将它们转发到新的Process
,但ProcessStartInfo
仅支持string
定义参数。
因此,仅将它们与空格连接是错误的,因为路径可能会被拆分为多个参数。我也不确定是否将它们用引号括起来,然后用空格连接它们是否适用于每个实例 - 我不这么认为,因为目标程序可能看不到 -u
和 "-u"
等效。在 .NET Framework 中是否有一种干净的方法可以做到这一点?
【问题讨论】:
It's all in the docs 和.Net 5+ 支持ProcessStartInfo.ArgumentList
@Charlieface 这没有回答问题。我知道它如何适用于具体案例。但我问的是在一般情况下它是如何工作的,也许已经有我可以使用的代码来正确清理参数。
ProcessStartInfo.Arguments
的文档确实指出对于 .net 程序 A single argument that includes spaces must be surrounded by quotation marks, but those quotation marks are not carried through to the target application.
这实际上意味着如果您将参数传递给 C# 程序,"-u"
和 -u
都将被看到作为-u
,即使它不包含任何空格。
@AyCe (对 Charlieface)这不能回答问题 - 是的,这就是为什么它是一个评论......
@MatthewWatson 是的,我知道。但我没有传递给 C# 程序。
【参考方案1】:
ProcessStartInfo
还有一个ArgumentList
属性,允许传递多个参数。
ArgumentList
和Arguments
属性相互独立,只能同时使用其中一个。两个 API 之间的主要区别在于ArgumentList
负责转义提供的参数并在内部构建一个字符串,在调用Process.Start(info)
时传递给操作系统。因此,如果您不确定如何正确转义您的论点,您应该选择ArgumentList
而不是Arguments
。
Reference
编辑
适用于
Product | Versions |
---|---|
.NET | .NET 5, .NET 6, .NET Core 2.1, .NET Core 2.2, .NET Core 3.0, .NET Core 3.1 |
.NET Standard | 2.1 |
【讨论】:
问题是针对 .NET Framework 的。以上是关于干净地将参数列表传递给 ProcessStartInfo的主要内容,如果未能解决你的问题,请参考以下文章
如何正确地将 ComboBox 的模型从 python (pyQt5) 传递给 QML?
React Native:如何正确地将 renderItem 项传递给 FlatList,以便它们可以在另一个组件中呈现?