2

非同期バックグラウンド ワーカーを使用してバッチ ファイルを実行するプログラムがあります。コードは次のとおりです。

public static void Execute(CmdObj obj, bool batch)
{
    CmdObj = obj;

    var theWorker = new BackgroundWorker();
    theWorker.RunWorkerCompleted += WorkerCompleted;
    theWorker.WorkerReportsProgress = true;

    if(batch)
    {
        theWorker.DoWork += WorkerBatchWork;
    }else{
        theWorker.DoWork += WorkerCommandWork;
    }
    theWorker.RunWorkerAsync();

}

private static void WorkerBatchWork(object sender, DoWorkEventArgs e)
{
    RunBatch(CmdObj);
}

private static void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    var temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase);
    if (temp != null)
        ProgramPath = temp.Substring(6);

    WriteLog(CmdObj.Activity, false);
    WriteLog(CmdObj.Error, true);

    CmdObj.TheButton.Enabled = true;
}

private static void RunBatch(CmdObj obj)
{
    var process = new Process();
    var startInfo = new ProcessStartInfo
                        {
                            FileName = obj.SrcFile,
                            WindowStyle = ProcessWindowStyle.Normal,
                            CreateNoWindow = false,
                            RedirectStandardInput = true,
                            RedirectStandardOutput = false,
                            RedirectStandardError = true,
                            UseShellExecute = false
                        };


    try
    {
        if (!obj.SrcFile.ToLower().Trim().EndsWith(".bat"))
            throw new FileLoadException("Not a valid .bat file",obj.SrcFile);

        process.StartInfo = startInfo;
        process.Start();
        process.WaitForExit();

        //obj.Activity = process.StandardOutput.ReadToEnd();
        obj.Error = process.StandardError.ReadToEnd();

    }
    catch (Exception ex)
    {
        obj.Exception = ex;
    }
    finally
    {
        process.Close();
    }
}

class CmdObj
{
    public string Command { get; set; }
    public string SrcFile { get; set; }
    public string Activity { get; set; }
    public string Error { get; set; }
    public Exception Exception { get; set; }
    public Button TheButton { get; set; }
}

したがって、このプログラムを実行して実行するバッチ ファイルを選択すると、空白の CMD ウィンドウが表示されます。プログラムがバッチ ファイルを実行するときに、CMD ウィンドウに出力を表示する方法はありますか? または、CMD出力をテキストボックスまたはその他のコントロールに(リアルタイムで)送信できる場合、それも機能します。

ありがとう!

4

2 に答える 2

0

次のプロパティのいずれかが に設定されてtrueいるため、空白の黒いウィンドウが表示されます

RedirectStandardInput
RedirectStandardOutput
RedirectStandardError 

これは、ターゲット プロセスから出力/入力を受信/送信するようにアプリケーションに指示したために実際に発生します。

この行を使用してバッチファイルから出力を取得しようとしていたことがわかります

//obj.Activity = process.StandardOutput.ReadToEnd();

残念ながら、アプリケーションがターゲット バッチ ファイルから出力を読み取ることができるように設定RedirectStandardOutputしない限り、これは機能しません。Trueそれ以外の場合、出力は空になります

private void RunBatch(CmdObj obj)
{
    var process = new Process();
    var startInfo = new ProcessStartInfo
    {
        FileName = obj.SrcFile,
        WindowStyle = ProcessWindowStyle.Normal,
        CreateNoWindow = false,
        RedirectStandardInput = true,
        RedirectStandardOutput = true, //This is required if we want to get the output
        RedirectStandardError = true,
        UseShellExecute = false
    };


    try
    {

        if (!obj.SrcFile.ToLower().Trim().EndsWith(".bat"))
        throw new FileLoadException("Not a valid .bat file",obj.SrcFile);

        process.StartInfo = startInfo;
        process.Start();
        process.WaitForExit();

        obj.Activity = process.StandardOutput.ReadToEnd(); //Get the output from the target process
        obj.Error = process.StandardError.ReadToEnd();

    }
    catch (Exception ex)
    {
        obj.Exception = ex;
    }
    finally
    {
        process.Close(); //Terminate the process after getting what is required
    }
}

:UseShellExecuteFalse使用するには、RedirectStandardOutput

ありがとう、
これがお役に立てば幸いです:)

于 2012-10-31T03:18:52.717 に答える
0

電話しなくていいの?

 process.BeginErrorReadLine();
 process.BeginOutputReadLine();

プロセス開始後?私の記憶が正しければ、これがないといくつか問題がありました。

于 2017-06-06T09:31:42.573 に答える