在通过命令启动Powershell窗口时,我遇到了捕获退出代码的问题。
我有一个Windows服务,它会以不同的时间间隔启动一个执行Powershell脚本的新进程。业务要求规定这些Powershell脚本必须与实际服务分开。 这些脚本需要输出要捕获的错误代码,以便在服务中相应地跟踪重试和完成。
我使用System.Diagnostics.Process
通过此代码启动Powershell脚本。
string command = "/V:ON /c powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -file ";
command += "\"" + scriptPath + "\" ^& echo !ERRORLEVEL! ";
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = command;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
string output = p.StandardOutput.ReadToEnd();
Logger.LogDebug(output)
在powershell脚本本身中,我使用exit ##
退出脚本并返回错误代码。
示例powershell:
write-host "Hi "
exit 10
使用此简单测试,output
字符串仅等于Hi
。完全不使用10
。我希望看到Hi 10
。
如果我将启动命令更改为以下内容,则会成功添加错误代码,但它始终为0
。
string command = "/c powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -file ";
command += "\"" + scriptPath + "\" & echo %ERRORLEVEL% ";
为了进一步测试,我在单独的批处理文件中运行这两个命令,直接查看输出,结果不一样。
命令:
cmd /V:ON /c powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -file "test.ps1" ^& echo !ERRORLEVEL!
pause
返回:
我期待的是
命令:
cmd /c powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -file "test.ps1" & echo %ERRORLEVEL%
pause
返回:
正如预期的那样,ERRORLEVEL
不会返回当前命令错误。如果再次运行特定命令,则返回上一次迭代的错误代码。
我觉得我可能会错过一些简单的东西,从Windows服务中的进程中获取正确的错误代码但是还没有能够解决这个问题。
有什么建议吗?
非常感谢!