如何在PowerShell中捕获.exe程序输出?多方法尝试均失败
解决PowerShell无法捕获外部程序输出的问题
可能的原因与解决方案
1. 修正cmd /c的重定向语法
你之前的cmd /c调用格式错误,2>&1需要作为cmd命令的一部分,而非独立参数。正确写法需把整个命令用引号包裹:
$cmd = "X:\app.exe" $output = cmd /c "$cmd 2>&1"
这样cmd才会识别2>&1是将标准错误重定向到标准输出的指令。
2. 尝试PowerShell原生的全流重定向
如果程序输出未走标准输出/错误流,而是直接写入控制台,可使用*>&1将所有流(包括控制台输出)重定向到标准输出:
$output = & $cmd *>&1
3. 通过文件中转捕获输出
部分程序会绕过标准流,直接调用Win32 API写入控制台,此时内存捕获会失效,需先将输出写入文件再读取:
$cmd = "X:\app.exe" $stdoutPath = Join-Path $env:TEMP "stdout.txt" $stderrPath = Join-Path $env:TEMP "stderr.txt" Start-Process -FilePath $cmd -NoNewWindow -Wait ` -RedirectStandardOutput $stdoutPath ` -RedirectStandardError $stderrPath $output = Get-Content $stdoutPath, $stderrPath Remove-Item $stdoutPath, $stderrPath
4. 检查PowerShell版本与环境差异
你提到另一台电脑可正常捕获,说明当前环境可能存在版本差异:
- 尝试升级到PowerShell 7.x,它对外部程序输出的处理更一致
- 确认当前是Windows PowerShell(5.x)还是PowerShell Core,两者在流重定向的细节上有区别
5. 验证程序输出的流向
可借助Process Monitor等工具查看程序调用的输出API,确认它是使用WriteFile(标准流)还是WriteConsole(直接控制台写入)。如果是后者,只能通过文件中转或第三方工具捕获。
内容的提问来源于stack exchange,提问作者Alfyn
相关产品推荐
相关产品推荐

