Powershell. Выполнение команд CMD

В этой статье я попробую собрать варианты выполнения команд CMD из консоли Powershell

Выполнение команд CMD с помощью символа вызова

Powershell распознает строку в кавычках просто как строку.
Что бы указать на то, что строка должна быть выполнена, требуется использовать специальный символ вызова, такой как  «&»

Для простых команд вполне подходят такие формы записи, в том числе и с аргументами

& "ping" ya.ru или & {ping ya.ru}

Выполняя утилиты CMD в консоли ISE вы можете наблюдать проблемы с кодировкой. Решение можно найти тут

Форма вызова команды с аргументами выглядит так

& "[path] command" [arguments]

Аргументов после закрытых кавычек может быть больше одного

При использовании оператора & вывод выполненных им команд будет отображен внутри консоли Powershell, без открытия нового окна.

Можно передать команду по конвейеру
"calc" | cmd
Start-Process

Мне нужно было выполнять в ходе повершельного скрипта вот такую команду с множеством параметров:

"C:\Program Files\gs\gs9.26\bin\gswin64c.exe" -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dCompatibilityLevel=1.4 -dQUIET -dBATCH -sOutputFile=C:\temp\output0.pdf C:\input.pdf

Лучшим вариантом оказалось перечисление параметров нужной команды через запятую, в виде аргументов параметра повершела ArgumentList:

Start-Process -FilePath "C:\Program Files\gs\gs9.26\bin\gswin64c.exe"`
-ArgumentList "-sDEVICE=pdfwrite", "-dPDFSETTINGS=/ebook",`
"-dNOPAUSE", "-dCompatibilityLevel=1.4", "-dQUIET",`
"-dBATCH", -sOutputFile=C:\temp\output0.pdf C:\input.pdf
Если вам интересно, то можете прочитать статью про уменьшение размера PDF документов, в рамках которой и использовалась данная команда, а так же разбор других параметров сжатия

Если вы хотите используя Start-Process получить вывод, как и при использовании оператора &, в текущий сеанс консоли, то используйте параметр -NoNewWindow

UPD!

Начиная с Powershell версии 3 появился механизм под названием Stop-Parsing. Предназначен он для того, что бы все символы в строке считывались как простой текст, без какой либо интерпретации. Соответственно, нужда в экранировании кавычками всех параметров и их значений отпадает.
Принцип: вся строка идущая после символа —% считывается как обычный текст
На примере вышеприведенной команды, посмотрим как упростилась ее запись:

& "C:\Program Files\gs\gs9.26\bin\gswin64c.exe" --% -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dCompatibilityLevel=1.4 -dQUIET -dBATCH -sOutputFile=C:\temp\output0.pdf C:\input.pdf
Отладка

Для отладки ошибок можно воспользоваться параметром перенаправления вывода, так как вызываемое окно CMD обычно моргает на мгновение и исчезает, и успеть прочитать появившийся текст просто не является возможным. А делать скриншоты появляющегося окна, при наличии штатного средства, это просто маразм XD

-RedirectStandardOutput c:\temp\output.txt

Также почитать про перенаправление вывода можно тут

Добавить комментарий

Ваш адрес email не будет опубликован.