В этой небольшой заметке рассмотрим, как выполнить несколько cmd или PowerShell команд в одной строке. Такая задача периодически возникает при вызове команд PowerShell из внешних программ, из планировщика заданий Windows, логон скриптов , когда нужно обойти политику выполнения скриптов PowerShell , или когда нужно быстро передать пользователю кусок кода для выполнения при диагностике/ исправлении проблем на компьютере.
Выполнение нескольких команд в консоли CMD
В cmd для последовательного запуска команд в одной строке используется оператор &
. Например:
net stop wuauserv & net start wuauserv & wuauclt /detectnow
Если нужно, чтобы вторая команда выполнялась только после успешного выполнения первой, используются формат &&
:
ipconfig /flushdns && ipconfig /renew
Можно использовать и обратное условие: вторая команда будет выполнена, только если первая вернула ошибку:
net stop wuauserv6 || net start wuauserv
Запуск нескольких команд PowerShell в одной строке
В PowerShell если использовать знак амперсанда для разделения команд в одной строке, появится ошибка:
The ampersand (&) character is not allowed. The & operator is reserved for future use;
Вместо знака & для разделения команд PowerShell в одной строке используется символ точка с запятой ( ;
):
restart-service wuauserv -verbose; get-process notepad
Эта однострочная PowerShell команда перезапустит службу Windows и после завершения первой команды выведет информацию о процессе .
Популярным примером сокращения команд в PowerShell является конвейеры (pipe/pipeline), которые позволяют передать результаты одной команды следующей по конвейеру. В PowerShell в качестве оператора конвейера используется символ “|”. Например, пример команды с конвейером:
Get-Service -Name wususerv | Stop-Service
Этот же код в полном виде можно записать в несколько строк:
$service = Get-Service -Name wususerv
$serviceName = $service.Name
Stop-Service -Name $serviceName
Получилась неплохая экономия по размеру кода, а код стал даже более простым и читаемым.
Для запуска нескольких команда PowerShell через меню Пуск -> Выполнить, используйте формат:
powershell -command &"{ipconfig /all; tracert yandex.ru; pause "Press any key to continue"}"
Если вы запускаете эти же команды через консоль powershell, используйте синтаксис:
powershell -command {ipconfig /all; tracert yandex.ru; pause "Press any key to continue"}
При запуске нескольких команд PowerShell через планировщик Windows , можно использовать такой формат:
c:windowsSystem32WindowsPowerShellv1.0powershell.exe -Command {Get-EventLog -LogName security; ipconfig /all ; get-service servicename}"
В версии PowerShell Core 7.x доступны новые операторы && и ||. Они работают так, же как в cmd.
Оператор &&
выполнит команды PowerShell справа от себя, если команда слева выполнена успешно:
Write-host "Hello!" && Write-host "World!"
Оператор ||
используется, когда нужно выполнить команду, если первая команда вернула ошибку:
get-service servicename || write-host "missing service"