如何确保PowerShell的一行不会在失败时中断脚本?

gblwokeq  于 2023-01-02  发布在  Shell
关注(0)|答案(4)|浏览(144)

我有一个命令mycommand,有时会给出错误的退出代码,但是我想继续执行脚本,但是我不想禁用其他行的错误退出代码。
在Linux系统上,我可以将命令更改为mycommand || true,这将确保此行始终成功。如何在Windows上的PowerShell中执行此操作?如果我按原样尝试|| true,PowerShell将显示“令牌”||“"不是此版本””中的有效语句分隔符。PowerShell中的等效语句分隔符是什么?

chhkpiq4

chhkpiq41#

对于任何给定的命令,无论其形式如何,以下习惯用法都可以确保:

  • (a)执行没有中止,并且
  • (b)不报告错误。
try {
  & $someCommand 2>$null
} catch { }
  • 重定向2>$null丢弃 * 非终止 * 错误以及 * 外部程序 * 的 * stderr * 输出(默认情况下不影响执行流)。
  • try / catch捕获所有的 * 终止 * 错误(包括 * 语句 * 和 * 脚本 * 终止错误),并且通过将catch块留空,执行可以安静地继续。

注:

  • 有关PowerShell令人困惑的复杂错误处理的系统概述,请参见GitHub docs issue #1583
  • ||&& * 在PowerShell (Core) 7+中提供 *-请参见this answer-但是:
  • 它们不对 * script *-终止错误起作用
  • 它们本身不会 * 沉默 * 错误,并且沉默 * 语句 *-终止错误在||&&中是不可能的(除非您先设置$ErrorActionPreference = 'SilentlyContinue';否则,您需要try/catch,它不能与||&&有意义地组合)。
col17t5w

col17t5w2#

解决方案是使用-ErrorAction SilentlyContinuecommon parameter。但是,请注意,这仅适用于Cmdlet,而不是所有命令。如果要运行非Cmdlet命令,则需要将其 Package 在Cmdlet中:

Invoke-Expression -ErrorAction SilentlyContinue -Command "mycommand"
wi3ka0sx

wi3ka0sx3#

Try catch block与ErrorAction stop对于常规cmdlet应该很有效

try {
    remove-item "C:\nonexistentfile" -ErrorAction Stop
}
catch {
    Write-Host $_
}
sqserrrh

sqserrrh4#

Powershell 7有那个操作符。

dir foo || $true

Get-ChildItem: Cannot find path 'C:\Users\js2010\foo\foo' because it does not exist.
True

相关问题