7

我想使用 C# 来执行一个 shell 脚本。基于类似的问题,我得出了一个看起来像这样的解决方案。

System.Diagnostics.Process.Start("/Applications/Utilities/Terminal.app","sunflow/sunflow.sh");

它当前打开终端,然后使用默认应用程序(在我的情况下为 Xcode)打开 shell 文件。更改默认应用程序不是一种选择,因为需要为其他用户安装此应用程序。

理想情况下,该解决方案将允许 shell 文件的参数。

4

2 回答 2

10

我现在无法使用 Mac 进行测试,但以下代码适用于 Linux,并且应该适用于 Mac,因为 Mono 非常接近 Microsoft 的核心 .NET 接口:

ProcessStartInfo startInfo = new ProcessStartInfo()
{
    FileName = "foo/bar.sh",
    Arguments = "arg1 arg2 arg3",
};
Process proc = new Process()
{
    StartInfo = startInfo,
};
proc.Start();

关于我的环境的一些注意事项:

  • 我专门创建了一个测试目录来仔细检查这段代码。
  • 我在子目录 foo 中创建了一个文件 bar.sh,代码如下:

    #!/bin/sh
    for arg in $*
    do
        echo $arg
    done
    
  • Main在 Test.cs 中围绕上面的 C# 代码包装了一个方法dmcs Test.cs,并使用mono Test.exe.

  • 最终输出为“arg1 arg2 arg3”,三个标记用换行符分隔
于 2012-09-06T15:42:49.600 回答
2

谢谢亚当,这对我来说是一个很好的起点。但是,由于某种原因,当我尝试使用上述代码(更改为我的需要)时,我遇到了错误

System.ComponentModel.Win32Exception: Exec format error

请参阅下面给出上述错误的代码

ProcessStartInfo startInfo = new ProcessStartInfo()
               {
                       FileName = "/Users/devpc/mytest.sh",
                       Arguments = string.Format("{0} {1} {2} {3} {4}",  "testarg1", "testarg2", "testarg3", "testarg3", "testarg4"),
                       UseShellExecute = false,
                       RedirectStandardOutput = true,
                       CreateNoWindow = true
                   };
                  Process proc = new Process()
                  {
                    StartInfo = startInfo,
                  };
                   proc.Start();
                   while (!proc.StandardOutput.EndOfStream)
                   {
                       string result = proc.StandardOutput.ReadLine();
                       //do something here
                   }

并花了一些时间想出了下面,它在我的情况下工作 - 以防万一有人遇到这个错误,试试下面

工作解决方案:

  var command = "sh";
    var scriptFile = "/Users/devpc/mytest.sh";//Path to shell script file
    var arguments = string.Format("{0} {1} {2} {3} {4}",  "testarg1", "testarg2", "testarg3", "testarg3", "testarg4");
    var processInfo = new ProcessStartInfo()
    {
        FileName = command,
        Arguments = arguments,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true

    };

    Process process = Process.Start(processInfo);   // Start that process.
    while (!process.StandardOutput.EndOfStream)
    {
        string result = process.StandardOutput.ReadLine();
        // do something here
    }
    process.WaitForExit();
于 2021-01-12T00:43:20.640 回答