Windows计划任务中PowerShell脚本终止进程并捕获exe输出的问题
问题分析与解决
问题根源
你直接在Start-Process后用>> $logFile的写法有误:这种方式会把Start-Process命令自身的输出重定向到日志,但Start-Process默认无输出,同时会吃掉-PassThru参数本该返回的进程对象,导致$process变量为空,自然无法通过$process.Id终止进程。
修正后的脚本
要同时实现捕获JustWaitKey.exe的控制台输出、保留进程对象用于后续终止,需使用Start-Process自带的-RedirectStandardOutput和-RedirectStandardError参数:
$logFile = "E:\BatchFiles\Log\JustWaitKey.txt" $exeOutputLog = "E:\BatchFiles\Log\JustWaitKey_Output.txt" # 单独存储exe输出,也可与主日志合并 "We're about to run our test program" >> $logFile # 用Redirect参数捕获exe的标准输出和错误,同时保留PassThru返回的进程对象 $process = Start-Process -FilePath "E:\BatchFiles\JustWaitKey.exe" ` -WorkingDirectory E:\BatchFiles ` -RedirectStandardOutput $exeOutputLog ` -RedirectStandardError $exeOutputLog ` -PassThru Start-Sleep -Seconds 5 Stop-Process -Id $process.Id # 若需将exe输出合并到主日志 Get-Content $exeOutputLog >> $logFile "Our test program has completed" >> $logFile
额外优化建议
- 如果
JustWaitKey.exe的处理时长不固定,建议把固定等待的Start-Sleep换成带超时的Wait-Process,比如Wait-Process -Id $process.Id -Timeout 300(超时300秒),避免不必要的等待或提前终止。 - 若希望exe输出直接追加到主日志,可将
$exeOutputLog设为与$logFile相同路径,注意日志内容的顺序(exe输出会先写入,之后再追加主日志消息)。
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

