Код выхода элемента копирования Powershell 1 - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть сценарий с несколькими файлами, которые я хотел бы скопировать, и я делаю это более или менее так.

Copy-Item xxx1 yyy1 -Force
Copy-Item xxx2 yyy2 -Force
Copy-Item xxx3 yyy3 -Force
Copy-Item xxx4 yyy4 -Force

и т. Д.

Теперь я бы хотел, чтобы этот скрипт завершал работу с 1, если какой-либо из файлов не был скопирован.

Заранее спасибо

1 Ответ

0 голосов
/ 11 ноября 2018

То, что вы запрашиваете, аналогично опции set -e в bash, которая заставляет скрипт мгновенно завершать работу в случае сбоя команды (кроме условных) [1] .

PowerShell не имеет такой опции [2] , но вы можете эмулировать ее:

# Set up a trap (handler for when terminating errors occur).
Trap { 
    # Print the error. 
    # IMPORTANT: -ErrorAction Continue must be used, because Write-Error
    #            itself would otherwise cause a terminating error too.
    Write-Error $_ -ErrorAction Continue
    exit 1 
}

# Make non-terminating errors terminating.
$ErrorActionPreference = 'Stop'

# Based on $ErrorActionPreference = 'Stop', any error reported by
# Copy-Item will now cause a terminating error that triggers the Trap
# handler.
Copy-Item xxx1 yyy1 -Force
Copy-Item xxx2 yyy2 -Force
Copy-Item xxx3 yyy3 -Force
Copy-Item xxx4 yyy4 -Force

# Handle failure of an external program.
foo.exe -bar
if ($LASTEXITCODE -ne 0) { Throw "foo failed." } # Trigger the trap.

# Signal success.
exit 0

Примечание

  • Внутри PowerShell, коды выхода не используются при обработке ошибок; они обычно вступают в игру только при вызове внешних программ из PowerShell или когда PowerShell / сценарию PowerShell необходимо сигнализировать об успехе или сбое во внешнем мире (при вызове из другой оболочки, например, cmd в Windows или bash на Unix-подобных платформах).

  • Автоматическая переменная $LASTEXITCODE PowerShell отражает код завершения самой последней исполняемой внешней программы / скрипта PowerShell, который вызывается exit <n>.

  • Вызовы внешним (консольным / терминальным) программам, которые сигнализируют об ошибке через ненулевой код выхода, , а не запускают блок trap, отсюда явный оператор throw в приведенном выше фрагменте кода.

  • Если вы не установили код выхода явно, то код завершения любой внешней программы, которая выполнялась последней, определяет общий код завершения скрипта.

[1] Обратите внимание, что у этого параметра есть свои критические замечания, потому что точные правила, когда допускается сбой и когда он вызывает отмену скрипта, трудно запомнить - см. http://mywiki.wooledge.org/BashFAQ/105

[2] Потенциальное добавление поддержки для него обсуждается в этом выпуске GitHub .

...