В этой статье я попробую собрать варианты выполнения команд CMD из консоли Powershell
Выполнение команд CMD с помощью символа вызова
Powershell распознает строку в кавычках просто как строку.
Что бы указать на то, что строка должна быть выполнена, требуется использовать специальный символ вызова, такой как «&»
Для простых команд вполне подходят такие формы записи, в том числе и с аргументами
& "ping" ya.ru или & {ping ya.ru}
Форма вызова команды с аргументами выглядит так
& "[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
Если вы хотите используя 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
Также почитать про перенаправление вывода можно тут