0

私は、C# のバックグラウンド ワーカーに関する強力な知識を必要とする、非常に奇妙な問題を抱えています。

コマンド ライン プログラムを実行し、その ERRORLEVEL を確認したいと考えています。

cmd.exe /c echo Launching the command && COMMAND_TO_RUN & echo Connexion statut : && echo %ERRORLEVEL% && if %ERRORLEVEL% NEQ 0 (echo FAILURE) ELSE (echo SUCCESS))

コマンドが失敗すると、ERRORLEVEL は値 -1 を取得します。

これは、cmd.exe でこの行を使用すると機能します。

しかし、ここに問題があります。

バックグラウンド ワーカーを使用してこの行を実行すると、COMMAND_TO_RUN が失敗しても ERRORLEVEL の値は 0 になります。

これが私のバックグラウンドワーカーコードです:

string[] args = { "/c echo Launching the command && COMMAND_TO_RUN  & echo Connexion statut : && echo %ERRORLEVEL% && if %ERRORLEVEL% NEQ 0 (echo FAILURE) ELSE (echo SUCCESS))};
backgroundWorker1.RunWorkerAsync(args);


 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string[] args = e.Argument as string[];
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.Arguments = args[0];
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.RedirectStandardInput = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardError = false;
        process.Start();
        System.IO.StreamReader sOut = process.StandardOutput;

        string tempOut;
        while (!sOut.EndOfStream)
        {
            // using the report progress userstate allow me to catch 
            // the program output in runtime
            tempOut = sOut.ReadLine();
            backgroundWorker1.ReportProgress(1, tempOut);
        }
        process.Close();
    }

バックグラウンドワーカーを使用すると、特定の値の ERRORLEVEL が発生しますか?

前もって感謝します

4

1 に答える 1

1

BackgroundWorker について何も知らなくても (申し訳ありません)、コマンド部分に少なくとも 3 つの問題があります。

  1. 実際の によってはCOMMAND_TO_RUN、生成されたインスタンス内で実行されない可能性がcmdあり、それとは無関係に、生成されたcmdインスタンスは問題なく実行を終了しているため、C# コードで取得するエラーレベル ( からの終了コードcmd) は 0 になる可能性があります。

  2. 行が によって読み取られるcmdと、解析されてから実行されます。解析フェーズでは、行の実行を開始する前に、実行するコマンドからすべての変数読み取り操作が削除され、変数内の値に置き換えられます。したがって、すべての%errorlevel%読み取り (すべて同じ行にあります) は、コマンドを実行しても変更されずCOMMAND_TO_RUN、コマンドの実行前に変数に値が返されます。

  3. 連結の問題があります。A & Bコマンド実行を連結するために使用されrun A, when finished run Bます。しかしA && B手段run A and if not errorlevel then run B(A && B || C手段run A, if not errorlevel run B, else run C)

このようなものを試してください(dir失敗するコマンドです)

cmd.exe /c "echo Launching the command & (( dir *.notexist >nul 2>nul  )&&( echo SUCCESS & exit /b 0 )||( echo FAILURE & exit /b 1 ))"
于 2014-10-28T15:01:33.703 に答える