7

C#を使用してシェルスクリプトを実行したいと思います。同様の質問に基づいて、私はこのような解決策にたどり着きました。

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

現在、ターミナルを開き、デフォルトのアプリケーション(私の場合はXcode)でシェルファイルを開きます。このアプリは他のユーザーのためにインストールする必要があるため、デフォルトのアプリケーションを変更することはできません。

理想的には、ソリューションはシェルファイルの引数を許可します。

4

2 に答える 2

10

現在Macでテストすることはできませんが、MonoはMicrosoftのコア.NETインターフェイスに非常に近いため、次のコードはLinuxで動作し、Macでも動作するはずです。

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上記のC#コードをTest.csでラップし、でコンパイルし、dmcs Test.csで実行しましmono Test.exeた。

  • 最終的な出力は「arg1arg2arg3」で、3つのトークンは改行で区切られています
于 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 に答える