Task Sequence中PowerShell脚本Try Catch块未触发的问题求助
问题分析与解决方案
针对Task Sequence中PowerShell脚本Try/Catch块未触发的问题,结合你描述的场景(手动F8运行正常、故意写错JSON路径触发错误但Catch不执行),以下是具体排查方向和解决方法:
1. 检查PowerShell运行位数差异
SCCM Task Sequence默认调用32位PowerShell(%windir%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe),而你按F8打开的是64位PowerShell。32位环境下部分系统路径访问、命令行为可能存在差异,导致错误处理逻辑失效。
解决方法:
- 在Task Sequence的「Run PowerShell Script」步骤中,勾选**"Run this step in the 64-bit runtime environment"**选项(针对64位系统部署场景),强制使用64位PowerShell执行脚本。
2. 确保-ErrorAction Stop全局生效
Task Sequence环境中,$ErrorActionPreference全局变量可能被设置为SilentlyContinue等值,会覆盖局部的-ErrorAction Stop参数,导致非终止错误无法转为终止错误触发Catch块。
解决方法:
- 在脚本的
try块开头添加全局错误偏好设置,确保所有命令的错误都能触发终止错误:try { $ErrorActionPreference = "Stop" $CDBJson = Get-Content -Path "C:\_SMSTaskSequence\CDB\CDB_Values.json1" -Raw | ConvertFrom-Json # 后续命令... } - 也可以为管道两端的命令分别设置
-ErrorAction Stop,避免管道前半部分的错误被忽略:$CDBJson = Get-Content -Path "C:\_SMSTaskSequence\CDB\CDB_Values.json1" -Raw -ErrorAction Stop | ConvertFrom-Json -ErrorAction Stop
3. 修正脚本编码与执行参数
Task Sequence对脚本编码敏感,若脚本为UTF-8无BOM编码,可能导致解析异常;同时执行参数的错误配置也会干扰错误处理逻辑。
解决方法:
- 将脚本保存为**UTF-16 LE(Unicode)**编码,这是PowerShell脚本的推荐编码,避免执行时的编码解析问题。
- 检查Task Sequence的脚本执行参数,确保使用
-File参数调用脚本,且未添加-ErrorAction SilentlyContinue等会屏蔽错误的参数。
额外调试优化
- 在Catch块中添加详细错误输出,方便定位问题:
catch { Write-Output "捕获错误信息:$($_.Exception.Message)" Write-Output "错误堆栈追踪:$($_.ScriptStackTrace)" $exitCode = 1 } - 调整
Stop-Transcript的位置,避免脚本退出后无法停止日志转录:Stop-Transcript exit $exitCode
内容的提问来源于stack exchange,提问作者wads
相关产品推荐
相关产品推荐

