【问题标题】:Cleanly passing a list of arguments to ProcessStartInfo干净地将参数列表传递给 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# 程序。

标签: c# .net windows process command-line-arguments


【解决方案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 的。
猜你喜欢
  • 2021-10-23
  • 2017-04-05
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
相关资源
最近更新 更多