如何通过批处理在单个cmd窗口后台启动程序、重定向stderr并获取PID
解决方案
你之前的脚本存在三个核心问题:
- 未给
Start-Process加-NoNewWindow参数,导致启动目标程序时会弹出新的控制台窗口 - 重定向符号
2>testlogerr.log作用于PowerShell进程本身,没有重定向目标程序testlogerr.exe的stderr输出 - 脚本没有保留交互环境的逻辑,双击运行后当前cmd窗口会自动退出
以下是满足全部需求的批处理脚本:
@echo off :: 调用PowerShell启动后台程序,重定向stderr并获取PID for /f "delims=" %%a in (' powershell -ExecutionPolicy Bypass -Command "$process = Start-Process -FilePath 'testlogerr.exe' -NoNewWindow -PassThru -RedirectStandardError 'testlogerr.log'; Write-Output $process.Id" ') do set "TESTLOGERR_PID=%%a" :: 打印进程PID echo testlogerr started, its PID is %TESTLOGERR_PID% :: 保留当前cmd窗口的交互提示符,双击运行也不会自动关闭 cmd /k
逻辑说明
- 后台启动+不新开窗口:
Start-Process加-NoNewWindow参数,禁止为目标程序新开控制台窗口,程序会在当前窗口后台静默运行,不会抢占前台输入焦点 - stderr重定向:通过
-RedirectStandardError 'testlogerr.log'参数直接对目标进程的stderr做重定向,日志会实时写入指定文件,不会输出到控制台 - PID获取:
-PassThru参数会返回启动的进程对象,通过for /f捕获PowerShell输出的PID值,存储到cmd变量TESTLOGERR_PID中 - 保留交互提示符:末尾加
cmd /k会在脚本执行完成后启动交互式cmd环境,不管是在已有cmd窗口运行脚本,还是双击bat文件运行,当前窗口都会保留交互能力,可正常输入其他命令
验证方法
- 运行脚本后,可执行
tasklist | findstr testlogerr.exe确认对应PID的进程正在运行 - 打开
testlogerr.log即可看到程序输出的日志内容,每2秒自动更新一行 - 需要终止后台进程时,执行
taskkill /PID %TESTLOGERR_PID% /f即可,无需关闭当前cmd窗口
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

