【问题标题】:Quotes in strings with Process.Start in C#, Mono 3.5 (Unity), OSX在 C#、Mono 3.5 (Unity)、OSX 中使用 Process.Start 在字符串中引用
【发布时间】:2016-06-06 14:15:22
【问题描述】:

搜索 stackoverflow 和谷歌这个问题只在 Windows 和 .NET 的上下文中得到了回答,而不是在 OSX 上的 Unity3D 中使用的 Mono 版本。无论出于何种原因,我在 Unity3D 的 OSX 上的 Mono 中都没有找到任何解决方案或答案。有可能我正在做一些非常愚蠢的事情,或者 Unity3D 的 Mono+OSX 可能从根本上破坏了某些东西。所以这个问题

我正在尝试使用 C#、Mono(Unity3D)、OSX 执行一个简单的命令。为了简单起见,这里是来自 shell 的命令

/bin/sh -c "echo \"hello world\""

这行得通。这是我的 C# 代码

// original working line
// /bin/sh      -c "echo \"hello world\""
string args = @"-c ""echo \""hello world\""""";

var proc = new System.Diagnostics.Process {
    StartInfo = new System.Diagnostics.ProcessStartInfo {
        FileName = "/bin/sh",
        Arguments = args,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardError = true,
        CreateNoWindow = true
    },
};
proc.Start();
string result = proc.StandardOutput.ReadToEnd();
result += proc.StandardError.ReadToEnd();
Debug.Log(proc.ExitCode);
Debug.Log(result);

失败了

Win32Exception: ApplicationName='/bin/sh', CommandLine='-c "echo \"hello world\""', CurrentDirectory=''

您可以看到参数(即CommandLine=)似乎是正确的

删除内引号有效

string args = @"-c ""echo hello world""";

当然,我的实际用例最终需要引号。

如何在 Mono(Unity3D) OSX 上将引号传递给 Process.Start

更新

事实证明,这是 Unity3D 中 Mono 特有的某种问题。如果在 Xamarin Studio 中运行相同的代码,它会按预期工作。

仍在寻找可能的解决方法。

【问题讨论】:

  • 我的声誉是 21k 加上也许你会让我怀疑我已经为此工作了 6 个小时。 Mono+OSX+C# 没有像 .NET on Window 那样被很好地覆盖。
  • 顺便说一句,您的代码在 centos 上对我来说可以正常工作。令人惊讶的是它在 OSX 上的任何不同。
  • 见上文。这显然是 Unity 中使用的单声道的问题。在 Xamarin Studio 中运行良好

标签: c# macos unity3d mono


【解决方案1】:

[ " ] 符号表示开始或结束字符串,为了将其视为简单符号,您需要在需要加引号或使用 unicode/ascii 代码时使用 [ \ ] 字符。

你的例子:

// -c "echo \"hello world\""
string args = "-c \"echo \"hello world\"\"";

为了能够从 IO 流中读取,您需要确保进程正确启动。 你可以简单地做到这一点:

proc.WaitForInputIdle();

那么你应该可以从它的 IO 中读取。

【讨论】:

  • 谢谢,但你的例子没有任何意义。请参阅语法突出显示。 @ 符号表示单引号结束字符串,反斜杠只是文字反斜杠,这意味着您的行不是有效的 C#。我不确定你想让我做什么。如果您希望我将每个引号的反斜杠一直传递到流程,那将是@"-c \""echo \""hello world\""\""";,但这没有任何意义。你真的希望第一个和最后一个引号有斜线吗?那不是您在评论中显示的内容。也许你的意思是@"-c ""echo \""hello world\""""";,但这正是我所拥有的。
  • 对不起,复制时我没有注意到'@'符号。但是,当您从头开始删除“@”并等待输入时,这应该有效(至少对我有效):)
  • 即使没有 at 符号也没有任何意义。您未转义的字符串是-c "echo "hello world""。如果你想通过-c "echo \"hello world\"",那么你需要string args = "-c \"echo \\\"hello world\\\"\"";。它也适用于 Unity3D 的 Mono 吗? (因为这就是问题所在)正如上面所指出的,我的原始示例适用于普通单声道。只有 Unity 的单声道失败了。
  • 它不是 Unity 的 Mono,只是简单的 Mono。是的,这适用于 Mono,但 Unity 有它自己的限制,所以我建议阅读这些限制:answers.unity3d.com/questions/820611/…msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
相关资源
最近更新 更多