Код выхода 1 для копирования элементов Powershell

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

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

и так далее.

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

То, что вы просите, похоже на опцию 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

Другие вопросы по теме