微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将参数数组序列化为 .NET Standard 2.0 中可用的 ProcessStartInfo 的字符串?

如何解决如何将参数数组序列化为 .NET Standard 2.0 中可用的 ProcessStartInfo 的字符串?

.NET 5.0 中有一个很好的 ArgumentsList 属性 processstartinfo,但是当我将我的库定位到 .NET Standard 2.0 时,我没有它可用,所以我必须手动转换参数.

显然,参数可以包含空格,也可以用空格分隔。所以我想我应该使用引号,然后引用可能出现在参数中的引号,这可能都是特定于平台的。

在 .NET Standard 2.0 中是否有可访问的工具? 如果不是,我的转换究竟应该做什么?

我知道它应该在包含空格的参数上添加双引号。 它也应该用双双引号转义双引号。 我通过在 Visual Studio 中项目属性的调试面板中尝试以下命令行来解决这个问题:

arg1 "arg 2" "arg ""3"""

当应用程序启动时,main函数获得以下参数:

“arg1”、“arg 2”和“arg“3”。所以看起来这应该可行,但我不完全确定是否应该考虑这一切。

我也想知道 - 它可以在 Linux 上运行吗? Linux 的转换是以相同的方式完成的,还是不同的?

更新: 我已经检查了 .NET 源代码......并且......

https://github.com/dotnet/runtime/blob/6d707d78c87c6c619d48537dff0568696a5d65bd/src/libraries/System.Private.CoreLib/src/System/PasteArguments.Unix.cs#L9

https://github.com/dotnet/runtime/blob/6d707d78c87c6c619d48537dff0568696a5d65bd/src/libraries/System.Private.CoreLib/src/System/PasteArguments.Windows.cs#L9

https://github.com/dotnet/runtime/blob/6d707d78c87c6c619d48537dff0568696a5d65bd/src/libraries/System.Private.CoreLib/src/System/PasteArguments.cs#L10

我看到的唯一区别是“无法通过解析器获得文字引用。” - 作为 Windows 的规则,在 Unix 版本上用双引号正常解析引号。这是我在 Windows 上的 Visual Studio 上测试时使用命令行制作的。

因为我只需要为 processstartinfo 创建命令行而不是将它们解析为参数集合 - 如果我采用前面提到的引用规则是完全安全的 - 所以将任何双引号转换为双双引号并将双引号添加到所有包含空格的参数。它应该适用于两个系统,并且可能会在一些非常非常特殊的情况下失败,而这些情况无论如何在我的库和用例中都是不可能的。我的库是命令行工具的类包装器,顺便说一句,命令行工具 AFAIK 仅存在于 Windows 上。

然而,该类旨在可能存在于 Linux 版本中,但其 IsSupported 属性在 Linux 上返回 false。所以无论 lib 做什么,都应该由 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 参数标记为警告。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。