【问题标题】:Get PowerShell to ignore exitcode?让 PowerShell 忽略退出代码?
【发布时间】:2017-02-10 18:00:04
【问题描述】:

我在 PowerShell 中使用 robocopy,如果文件已成功复制,robocopy 返回退出代码 1,这告诉 PowerShell 失败。是否有一个好的做法可以忽略错误,因为它不是错误?

$source = "$env:buildlocation\Reports\$env:ctrelname\DiskImages\DISK1";
$target = "$env:builddestination\$env:ctrelver\$env:ctrelname\Reports";
$robocopyOptions = @('/e', '/r:0', '/np');
Get-ChildItem -Path $source -Directory -Attributes !Hidden |
    Sort-Object -Property CreationTime |
    ForEach-Object { & robocopy.exe $source $target $robocopyOptions };
echo $LASTEXITCODE

【问题讨论】:

  • 例如见this question
  • 你为什么需要那个?除非您明确处理退出代码,否则外部命令的退出代码对 PowerShell 无关紧要。

标签: powershell exit-code


【解决方案1】:

我在 Jenkins 运行的 PowerShell 脚本中使用 robocopy 时遇到了同样的情况;在这种情况下,清除 LASTEXITCODE强制,因为 Jenkins 在工作结束时会检查它并且你的工作会失败(当然不包括你在 robocopy 之后调用另一个外部命令来清除最后的退出代码。

我用过这段代码:

$initialExitCode = $global:LASTEXITCODE
Invoke-Expression "robocopy ..."
# See robocopy exit codes: if it's less than 8, there should be no terminal error
if (($initialExitCode -eq 0 -or [string]::IsNullOrWhiteSpace($initialExitCode)) -and $LASTEXITCODE -le 7) {
    $global:LASTEXITCODE = 0
}

【讨论】:

  • 在浪费了很多时间之后真的救了我!!
【解决方案2】:

如上所述,PowerShell 不会评估本机命令的错误代码。它仅将其存储在$LastExitCode 中。试试这个简单的例子:

Invoke-Expression 'cmd /c "exit 5"'

PowerShell 仅在 $LastExitCode 中存储 5。

【讨论】:

    猜你喜欢
    • 2023-01-26
    • 1970-01-01
    • 2021-11-12
    • 2017-12-23
    • 1970-01-01
    • 2021-12-05
    • 2012-03-09
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多