Скрипт PowerShell, показывающий выполнение команд

37

Я играю со скриптами PowerShell, и они отлично работают. Тем не менее, мне интересно, есть ли способ также показать все команды, которые были запущены, как если бы вы вводили их вручную. Это будет похоже на «echo on» в пакетных файлах. Я посмотрел на аргументы командной строки PowerShell, командлеты, но не нашел ничего очевидного. Благодарность!

Нельсон Ротермел
источник

Ответы:

45

Следующая команда выведет каждую строку скрипта в Write-Debug-

Set-PSDebug -Trace 1

От man Set-PSDebug

Когда для параметра Trace установлено значение 1, каждая строка сценария отслеживается по мере его выполнения. Когда для параметра установлено значение 2, также отслеживаются назначения переменных, вызовы функций и вызовы сценариев. Если указан параметр Step, вам будет предложено выполнить каждую строку сценария.

Spongeboy
источник
Если вы добавите это в сценарий, который использует Param, не забудьте поместить эту строку под блоком определения параметров, иначе это может вызвать сбои.
kayleeFrye_onDeck
4

Где я использовал echo onв CMD, я теперь использую Write-Verboseи Set-PSDebug -Stepвместо. Они не одинаковы, но они более могущественны, если ими владеют умело.

Джей Базузи
источник
2

Гадкий:

PS > get-content foo.ps1|foreach-object{$_;invoke-expression "$_"}
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
powershell
PS > get-content foo.ps1
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
PS >

Проблема с вышеупомянутым состоит в том, что если у вас есть многострочные команды, подобные этой:

foreach($proc in $procs){
  $proc.processname
}

Выше не получится с моим примером выше, если он помещен в foo.ps1 с этой структурой ...

Марко Шоу
источник
Да, я продолжаю находить такие решения. Я действительно думаю, что нет «серебряной пули» для того, что я хочу. Спасибо за творческий подход к этим решениям. У меня есть несколько вариантов сейчас, и мне придется решить, куда идти дальше.
Нельсон Ротермел
2
help about_History 

Расскажу вам обо всех командах и

Get-History [options]  

вернет полный список для вас, чтобы манипулировать \ отображать и т. д.

Helvick
источник
2
Я нашел "set-psdebug -trace 1", который будет показывать команды, но много лишнего "шума" я не хочу. get-history ничего не выводит в скрипте. Если бы это было так, я мог бы вставить его в конец скрипта, но тогда команды не были бы встроенными (до вывода команды), и любые исключения пропустили бы это (если я, конечно, не поймаю его). Это все еще хороший, чтобы иметь в виду ... Есть еще идеи?
Нельсон Ротермел
Ах - вы имеете в виду, что вы хотите захватить ввод и вывод, или, по крайней мере, вы хотите, чтобы эхо-команды ввода немедленно следовали за соответствующим выводом? Один из способов сделать это - поместить результаты в массив, а затем перебрать результаты истории, выдав команду с последующим выводом.
Хелвик
start-transcript также может делать то, что вы ищете, но он будет ограничен только консольной текстовой частью действия.
Хелвик
Вы получили это - так же, как работает командный файл. Сейчас у нас есть куча пакетных файлов, и я смотрю на возможность их замены скриптами PowerShell. У нас есть программное обеспечение для планирования, ведения истории вывода и т. Д. Без ввода команды ввода ее сложнее отлаживать. Я предполагаю, что для выдачи результатов требуется, чтобы вы делали это для каждой команды, чтобы вы ловили исключения и т. Д., Чтобы ничего не пропустить. Еще один вариант, но не совсем то, что я ищу. Возможно, нам просто нужно выбрать один вариант и работать с ним.
Нельсон Ротермел
Я попробовал start-transcript, но он только записал, что запустился / остановился, но между ними ничего нет. Я где-то читал, что это предназначено для интерактивных команд.
Нельсон Ротермел