.NET 5.0 中的 ProcessStartInfo
有一个很好的 ArgumentsList
属性,但是当我将我的库定位到 .NET Standard 2.0 时,我没有它可用,所以我必须手动转换参数。
显然,参数可以包含空格,并且它们也由空格分隔。所以我想我应该使用引号,但然后引用参数中可能出现的引号,这可能都是特定于平台的。
.NET Standard 2.0 中是否有可访问的工具? 如果不是,我的转换到底应该做什么?
我知道它应该在包含空格的参数上添加双引号。 它还应该用双双引号转义双引号。 我通过在 Visual Studio 中的项目属性的“调试”面板中尝试以下命令行来解决这个问题:
arg1 "arg 2" "arg ""3"""
当应用程序启动时,main函数获得以下参数:
“arg1”、“arg 2”和“arg“3””。所以看起来这应该可行,但我不完全确定这是否是应该考虑的全部。
我还想知道 - 它能在 Linux 上运行吗? Linux 的转换是以相同的方式还是不同的方式完成的?
更新: 我检查了 .NET 源代码...并且...
我看到的唯一区别是“无法通过解析器获得文字引用。” - 作为 Windows 的规则,在 Unix 版本上通常用双引号解析引号。这是我在 Windows 上的 Visual Studio 上进行测试时发现的使用命令行制作的结果。
因为我只需要为 ProcessStartInfo
创建命令行,而不是将它们解析为参数集合 - 如果我采用前面提到的引用规则,这是完全安全的 - 因此将任何双引号转换为双双引号并添加所有包含空格的参数都用双引号引起来。它应该在两个系统上都能工作,并且可能在一些非常非常具体的情况下失败,而这些情况在我的库和用例中是不可能的。我的库是命令行工具的类包装器,顺便说一句,命令行工具 AFAIK 仅存在于 Windows 上。
但是,该类本来应该存在于 Linux 版本中,但其 IsSupported
属性在 Linux 上返回 false。因此,无论该库做什么,都应该由 Linux 平台上的另一个工具来处理。目标是允许在一个程序中实现不同的实现,具体取决于运行的操作系统。
最佳答案
public static class ProcessExtensions {
public static void SetArguments(this ProcessStartInfo processStartInfo, IEnumerable<string> args) {
processStartInfo.Arguments = String.Join(" ", args.Select(arg => {
if (arg.Contains('"')) arg = arg.Replace("\"", "\"\"");
if (arg.Contains(' ')) arg = '"' + arg + '"';
return arg;
}));
}
}
这是我的快速解决方案,但也许您可以找到更好的解决方案。我知道,args
未进行空值测试。然而该项目被标记为 nullable
,所以IEnumerable<string>
而不是IEnumerable<string?>?
意味着 args 不能为 null,VS 会将所有可能出现 null 参数的可能性标记为警告。
关于c# - 如何将参数数组序列化为 .NET Standard 2.0 中可用的 ProcessStartInfo 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66871387/