来自C#的{Powershell退出代码

时间:2017-05-19 16:57:50

标签: c# powershell

在通过命令启动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

返回:

Command1

我期待的是

命令:

cmd /c powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -WindowStyle Hidden -file "test.ps1" & echo %ERRORLEVEL% 
pause

返回:

Command2

正如预期的那样,ERRORLEVEL不会返回当前命令错误。如果再次运行特定命令,则返回上一次迭代的错误代码。

我觉得我可能会错过一些简单的东西,从Windows服务中的进程中获取正确的错误代码但是还没有能够解决这个问题。

有什么建议吗?

非常感谢!

0 个答案:

没有答案