如何通过Process类运行CmdLet(以Write-Output为例)
解决Process类运行PowerShell Cmdlet的问题
你遇到的错误是因为Write-Output是PowerShell的内置Cmdlet,不是独立可执行文件,无法直接通过Process类调用。必须借助PowerShell的可执行程序(powershell.exe或pwsh.exe)间接执行,同时配置输出重定向以获取结果。
正确实现代码
using System.Diagnostics; using System.Threading.Tasks; public async Task<string> GetWriteOutputResult() { using (Process process = new Process()) { // 指定PowerShell可执行文件,Windows默认用powershell.exe,PowerShell 7+用pwsh.exe process.StartInfo.FileName = "powershell.exe"; // 通过-Command参数执行Write-Output命令 process.StartInfo.Arguments = "-Command \"Write-Output 'hello'\""; // 启用输出重定向必须关闭ShellExecute process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.CreateNoWindow = true; // 不显示PowerShell窗口 process.Start(); // 先异步读取输出,避免缓冲区满导致死锁 string output = await process.StandardOutput.ReadToEndAsync(); string error = await process.StandardError.ReadToEndAsync(); await process.WaitForExitAsync(); // 结果可能带换行符,按需Trim处理 return output.Trim(); } }
关键配置说明
- 可执行文件指定:必须指向PowerShell的官方可执行程序,系统默认路径下直接写
powershell.exe即可被找到,PowerShell 7及以上版本替换为pwsh.exe。 - 命令参数传递:用
-Command(或简写-c)包裹要执行的Cmdlet命令,注意字符串的引号转义规则。 - 输出重定向配置:
UseShellExecute必须设为false,同时开启RedirectStandardOutput,才能读取进程的标准输出内容。 - 死锁规避:需在等待进程退出前完成标准输出和错误输出的读取,防止因缓冲区溢出导致进程挂起。
内容的提问来源于stack exchange,提问作者Bart Friederichs
相关产品推荐
相关产品推荐

