В этой небольшой заметке рассмотрим, как выполнить несколько 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:\windows\System32\WindowsPowerShell\v1.0\powershell.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"