У меня есть сценарий с несколькими файлами, которые я хотел бы скопировать, и я делаю это примерно так.
Copy-Item xxx1 yyy1 -Force
Copy-Item xxx2 yyy2 -Force
Copy-Item xxx3 yyy3 -Force
Copy-Item xxx4 yyy4 -Force
и так далее.
Теперь я бы хотел, чтобы этот сценарий завершился с 1, если какой-либо из файлов не был скопирован.
заранее спасибо





То, что вы просите, похоже на опцию 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
# Failure of an EXTERNAL PROGRAM must be handled EXPLICITLY,
# because `$ErrorActionPreference = 'Stop'` does NOT apply.
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-подобном платформы).
Автоматическая переменная PowerShell $LASTEXITCODE отражает код выхода последней выполненной внешней программы / сценария PowerShell, который вызывал exit <n>.
Вызов внешних (консольных / терминальных) программ, которые сигнализируют об отказе с помощью ненулевого кода выхода, запускают блок trap с помощью нет, отсюда явный оператор throw в приведенном выше фрагменте.
[1] Note that this option has its critics, because the exact rules around when a failure is tolerated and when it causes a script to abort are hard to remember - see http://mywiki.wooledge.org/BashFAQ/105
[2] Potentially adding support for it is being discussed in this RFC proposal.
Вы можете сделать что-то подобное, и он завершится с количеством ошибок команды PowerShell.
$errorcount = $error.count
Copy-Item xxx1 yyy1 -Force
Copy-Item xxx2 yyy2 -Force
Copy-Item xxx3 yyy3 -Force
Copy-Item xxx4 yyy4 -Force
exit $error.count - $errorcount