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

问题场景:

在一个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退出这个状态。后来在stackoverflow找到很简单的解决方法,只要增加4个字符“<NUL”,bat文件改为如下代码,问题就解决了:

powershell.exe -command "[xml]$config = Get-Content repositories.config; " < NUL
posted @   dudu  阅读(3500)  评论(2编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
历史上的今天:
2006-08-23 [征询意见]如何建立一个有效的团队负责博客园的日常运营
2006-08-23 Event ID 333错误的解决方法
2005-08-23 [公告]关于联系与回复通知邮件地址
2004-08-23 [小改进]通过Enter键提交搜索关键字
点击右上角即可分享
微信分享提示