2

私にはユーザーがいます。それを「MyUser」と呼びましょう。それはパスワードを持っています、それが「パスワード」であると仮定します。このユーザーはgit用のSSHキーを持っています。ASP.NETアプリケーションからgitコマンドを発行するバッチファイルを実行しようとしています。これは、パラメーターとして渡される場所にあります。私の機能は次のとおりです。

    private void ExecuteCommand(string path, int timeout)
    {
        Process process = new Process();

        process.StartInfo = new ProcessStartInfo();
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.Arguments = "\"" + path + "\"";
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.UseShellExecute = false;
        //processInfo.WorkingDirectory = Config.GitHubRepoPath;
        process.StartInfo.UserName = "MyUser";
        process.StartInfo.Password = new System.Security.SecureString();
        process.StartInfo.Password.AppendChar('P');
        process.StartInfo.Password.AppendChar('a');
        process.StartInfo.Password.AppendChar('s');
        process.StartInfo.Password.AppendChar('s');
        process.StartInfo.Password.AppendChar('w');
        process.StartInfo.Password.AppendChar('o');
        process.StartInfo.Password.AppendChar('r');
        process.StartInfo.Password.AppendChar('d');
        // *** Redirect the output ***
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardOutput = true;

        process.Start();

        // *** Read the streams ***
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();

        if (timeout <= 0)
        {
            process.WaitForExit();
        }
        else
        {
            process.WaitForExit(timeout);
        }


        int exitCode = process.ExitCode;
        process.Close();
        return new ShellCommandReturn { Error = error, ExitCode = exitCode, Output = output };
    }

しかし、この関数を実行すると、ExitCodeは-1073741502であり、エラーと出力は空です。この動作を修正するにはどうすればよいですか?

私を助けてください、私はこれを文字通り何日も解決しようとしました。

4

1 に答える 1

0

標準エラーと標準出力の両方をリダイレクトし、両方を同期的に消費しようとするのは間違っていると思います。このリンクを参照してください: http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput%28v=vs.100%29.aspx

抜粋をコピーさせてください:

親プロセスがp.StandardOutput.ReadToEndに続いてp.StandardError.ReadToEndを呼び出し、子プロセスがエラーストリームを満たすのに十分なテキストを書き込むと、デッドロック状態が発生します。親プロセスは、子プロセスがStandardOutputストリームを閉じるのを無期限に待機します。子プロセスは、親が完全なStandardErrorストリームから読み取るのを無期限に待機します。

もう1つは、... cmd.exeインスタンスを呼び出すときに、「/c」引数も追加してみてください。

于 2013-07-11T10:44:34.327 に答える