【问题标题】:How to catch errors in Powershell script invoked with Invoke-Expression?如何在使用 Invoke-Expression 调用的 Powershell 脚本中捕获错误?
【发布时间】:2018-05-09 18:50:09
【问题描述】:

我正在使用 Invoke-Expression 从另一个 PS 脚本调用一个 PS 脚本,但我无法确定必须从调用脚本中检测到另一个脚本失败。实际上我只是想让调用脚本在这种情况下停止,我希望 $ErrorActionPreference = "Stop" 能解决问题。

调用脚本:

$ErrorActionPreference = "Stop"
$psCommand = ".\Work.ps1 -a -b " + $var
Invoke-Expression $psCommand

# More work

工作.ps1:

param
(
    [string]$a,
    [switch]$b = $false
)
$ErrorActionPreference = "Stop"

# Do Stuff

If ($x -ne 0) 
{
    Write-Output ("Stuff failed")
    Exit 2
}

这不起作用。 Work.ps1 以代码 2 退出后调用脚本不会停止。我需要在调用脚本中使用 try-catch 吗?还是我需要查看 $error? (看起来很复杂)

【问题讨论】:

  • throw 而不是exit-ing
  • @Mathias:谢谢。这让我走上了正确的轨道。事实证明,由于我使用的是$ErrorActionPreference = "Stop",我可以只使用Write-Error 而不是Write-Output。这也会停止脚本。
  • 另外,这样做的好处是您没有在函数中使用 Write-Output(我在早期的 PowerShell 时代曾经这样做过)。当您查看函数的返回时,如果您使用了 Write-Output,您将获得一串文本以及您想要返回的任何其他内容,所有这些都组合在一起。它可能很乱。如果您考虑一下通常的 PowerShell cmdlet 是如何编写的,它们通常不会将文本返回到输出流,而是返回对象、空值、布尔值或错误和/或警告。尝试编写这样的函数,它会在未来为您服务:)
  • @Robin:我确实在调用脚本的其他几个地方使用了 Write-Output。它写入在某些情况下可能有用的各种状态消息。我不确定我是否明白我应该做什么。上下文是从 Visual Studio 构建事件(因此是一种 cmd 脚本)调用脚本。写入输出将成为构建日志的一部分,这非常有用。
  • 在调用脚本中写入输出没问题!如果您将 Write-Output 管道传输到日志文件,也在函数内部;对以后复习很有用。如果这是你正在做的,我很抱歉。如果您希望在执行脚本时将信息输出到屏幕,请尝试使用Write-Verbose 获取信息性消息并尝试使用Write-Debug 进行调试(例如,检查变量是否符合您的预期,或者是否满足条件等)。要查看这些,您可以编写一个支持传递 -Verbose 或 -Debug 的高级函数,或者只设置 $DebugPreference 或 $VerbosePreference = 'Continue'。

标签: powershell


【解决方案1】:

这行得通,因为我使用 $ErrorActionPreference = "Stop"。否则我应该扔:

param
(
    [string]$a,
    [switch]$b = $false
)
$ErrorActionPreference = "Stop"

# Do Stuff

If ($x -ne 0) 
{
    Write-Error ("Stuff failed")
}

【讨论】:

  • 我正在尝试,但 SO 不会让我这样做。新手问题:如何给 cmets 投票??
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
相关资源
最近更新 更多