干净地将参数列表传递给 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 属性,允许传递多个参数。

ArgumentListArguments 属性相互独立,只能同时使用其中一个。两个 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?

在 C# 中如何正确地将 int 数组传递给函数

将数组/列表传递给 Python 函数

React Native:如何正确地将 renderItem 项传递给 FlatList,以便它们可以在另一个组件中呈现?

如何迭代地将参数传递给 R 函数

获取传递给具有未知数量参数的方法的参数数量