1

jar ファイルを呼び出す ac シャープ プログラムを作成しようとしています。

この種の質問について多くの解決策を探しましたが、わかりません。

これが私の状況です。実際にjarファイルを呼び出す前に、テストのために java -version を呼び出してみました。

これは引数cmdでコマンドラインを実行するメソッドです

public static string StartCmdProcess(string[] cmd)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.AutoFlush = true;
            for (int i = 0; i < cmd.Length; i++)
            {
                p.StandardInput.WriteLine(cmd[i].ToString());
            }
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return strRst;
        } 

そして私の主な方法で

電話する

string result = StartCmdProcess(new string[] { "java -version" });
Console.WriteLine(result);

「Java」を呼び出すと、正常に動作し、印刷されるはずのすべてが出力されます。

しかし、 java -version のように引数を入れると、うまくいきません。

この問題の何が問題なのか知っている人はいますか?

誰かが助けてくれれば大歓迎です:)

EDITED:呼び出しの結果は、実際には StandardOutput ではなく StandardError になりますが、それはかなり配線されています。誰でも理由を知っていますか?

public static string StartCmdProcess(string[] cmd)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.AutoFlush = true;
            for (int i = 0; i < cmd.Length; i++)
            {
                p.StandardInput.WriteLine(cmd[i].ToString());
            }
            p.StandardInput.WriteLine("exit");
            strRst.Append(p.StandardOutput.ReadToEnd()).Append(p.StandardError.ReadToEnd());
            p.WaitForExit();
            p.Close();
            return strRst.ToString();
        }
4

2 に答える 2

1

次のように、 cmdパラメータを使用するようにメソッドを変更する必要があります。

public static string StartCmdProcess(string[] cmd)
{
    System.Diagnostics.Process p = new System.Diagnostics.Process
    {
        StartInfo =
        {
            FileName = cmd[0],
            Arguments = cmd.Length>1?cmd[1]:"",
            UseShellExecute = false,
            RedirectStandardInput = true,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = true,
        }
     };
     p.Start();
     p.StandardInput.AutoFlush = true;
     for (int i = 0; i < cmd.Length; i++)
     {
         p.StandardInput.WriteLine(cmd[i].ToString());
     }
     p.StandardInput.WriteLine("exit");
     string strRst = p.StandardOutput.ReadToEnd();
     p.WaitForExit();
     p.Close();
     return strRst;
 } 
于 2013-04-26T10:33:38.777 に答える