解决“System.Diagnostics.Process调用批处理运行powershell.exe”的问题

时间:2022-08-29 14:49:54

问题场景:

在一个ASP.NET程序中,需要调用一个命令行下的bat(批处理)程序完成一些操作,而在该bat程序中又要调用powershell.exe -command运行powershell代码。

示例代码如下:

powershell.exe -command "[xml]$config = Get-Content repositories.config; "

如何在ASP.NET中调用bat程序员,请参考:在ASP.NET中运行控制台程序

调用bat的部分代码:

ProcessStartInfo info = new ProcessStartInfo();
info.WorkingDirectory
= workingDirectory;
info.CreateNoWindow
= true;
info.RedirectStandardOutput
= true;
info.RedirectStandardInput
= true;
info.RedirectStandardError
= true;
info.UseShellExecute
= false;

System.Diagnostics.Process p
= new Process();
p.StartInfo
= info;
p.Start();
output.Append(p.StandardOutput.ReadToEnd());
p.WaitForExit();
p.Close();

遇到的问题:

通过System.Diagnostics.Process执行bat之后,不能正常退出,也就是上面代码中的p.WaitForExit()一直在等待bat退出。

从浏览器看,浏览器一直处于“等待服务器返回”状态。

在服务器上,通过任务管理器可以看到一个powershell.exe进程一直存在。强制结束这个进程,浏览器就能得到正常返回。

解决方案:

根据以前的经验判断,应该是powershell.exe处于等待输入状态,开始不知道如何让powershell.exe退出这个状态。后来在*找到很简单的解决方法,只要增加4个字符“<NUL”,bat文件改为如下代码,问题就解决了:

powershell.exe -command "[xml]$config = Get-Content repositories.config; " < NUL