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();
    }

那么使用 backgroundworker 会导致 ERRORLEVEL 的特定值吗?

提前致谢

4

1 回答 1

1

在不了解 BackgroundWorker 的情况下(抱歉),命令部分至少存在三个问题:

  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 BA && 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 回答