【发布时间】:2021-10-10 08:19:33
【问题描述】:
我有我的静默安装 PowerShell 脚本,但我有一个问题,即使某些参数不正确,我的 powershell 脚本执行也不会失败。
$expression="C:\app\tool.exe /COMPUTER=server1 /INSTALL /SILENT"
try {
Invoke-Expression $expression -ErrorAction Stop
}
catch {
Write-Host "Entered Exception"
}
不幸的是它总是“绿色”,就像执行成功并且没有抛出任何错误一样。
在日志中,我可以看到它是“意外取消”设置。
******************************************************** Error:
Connect to computer registry failed
Computer 'SERVER1' does not exist
The network path was not found.
Unattended setup >>> 'Cancel'
********************************************************
Exit code = 0x4C7
我的脚本没有输入catch 子句。
是否有可能我可以以某种方式强制它失败,所以我可以捕捉到那个错误。
我有一个大问题,我的 powershell 没有失败,虽然它应该是因为它有错误的安装参数。
谢谢!!!
【问题讨论】:
-
@AdityaNair 如果我在没有 Invoke-Expression 的情况下执行脚本,是否相关?如果我在没有 Invoke-Expression 的情况下执行,我会得到完全相同的行为 - 我没有收到任何错误
"C:\app\tool.exe /COMPUTER=server1 /INSTALL /SILENT"你能告诉我为什么如果我直接运行 .exe 文件它不会抛出错误吗? -
在exe执行结束时检查
$LASTEXITCODE的输出。如果状态不为 0,则抛出错误。我已将其发布在答案中以供参考。 -
从 PowerShell 7.2 开始,对外部程序的调用不会导致 PowerShell 错误(即使通过
Invoke-Expression),这意味着 PowerShell 的错误处理功能(例如try { ... } catch { ... }) 不适用(除了意外,由于重定向到 v7.1 的错误)。相反,检查$LASTEXITCODE是否为非零以确定外部程序是否失败。 未来 PowerShell 版本可能会提供一种opt-in 机制,用于将外部程序调用集成到 PowerShell 的错误处理中。详情请见the linked duplicate。
标签: powershell