如何在PowerShell中捕获Python脚本错误输出并发送至邮件?
解决PowerShell捕获Python脚本错误输出并发送邮件的问题
问题原因
Python脚本抛出的未捕获异常信息默认输出到标准错误流(stderr),而你当前的$output = python runThisScript.py仅捕获了标准输出流(stdout),因此失败场景下$output为空,导致邮件内容空白。
解决方案
方法1:合并标准输出与错误输出
将Python的stderr重定向到stdout,一次性捕获所有输出内容,修改PowerShell执行命令如下:
$output = python runThisScript.py 2>&1
2>&1是PowerShell的流重定向语法,代表把错误流(编号2)的内容合并到输出流(编号1)中,这样$output会同时包含脚本正常打印的内容和错误的Traceback信息。
方法2:分别捕获标准输出与错误输出
如果需要区分处理正常输出和错误信息,可以使用Start-Process单独捕获两个流的内容:
# 启动Python脚本并分别重定向输出和错误到临时文件 $process = Start-Process -FilePath python -ArgumentList "runThisScript.py" -NoNewWindow -PassThru -RedirectStandardOutput "stdout.tmp" -RedirectStandardError "stderr.tmp" $process.WaitForExit() # 读取临时文件内容 $stdout = Get-Content "stdout.tmp" $stderr = Get-Content "stderr.tmp" # 合并或单独使用内容 $output = $stdout + $stderr # 清理临时文件 Remove-Item "stdout.tmp", "stderr.tmp" -Force
结合退出码判断执行状态
Python脚本抛出未捕获异常时,会返回非0的退出码,可通过$LASTEXITCODE获取,用于区分执行结果并构造对应邮件内容:
---some line of code-- $output = python runThisScript.py 2>&1 $exitCode = $LASTEXITCODE # 构造邮件主题和内容 if ($exitCode -eq 0) { $emailSubject = "Python脚本执行成功" $emailBody = "脚本执行输出:`n`n$($output -join "`n")" } else { $emailSubject = "Python脚本执行失败" $emailBody = "脚本执行错误信息:`n`n$($output -join "`n")" } --- write email--- # 此处使用$emailSubject和$emailBody发送邮件
$output -join "n"`用于将数组形式的输出内容转换为换行分隔的字符串,保证邮件内容格式清晰。
内容的提问来源于stack exchange,提问作者Praneeth
相关产品推荐
相关产品推荐

