PowerShell-Skript mit den ausgeführten Befehlen

36

Ich spiele mit PowerShell-Skripten herum und sie funktionieren hervorragend. Ich frage mich jedoch, ob es eine Möglichkeit gibt, auch alle ausgeführten Befehle anzuzeigen, als ob Sie sie manuell in sich selbst eingeben würden. Dies wäre ähnlich wie "Echo ein" in Batch-Dateien. Ich habe mir die PowerShell-Befehlszeilenargumente und Cmdlets angesehen, aber nichts Offensichtliches gefunden. Vielen Dank!

Nelson Rothermel
quelle

Antworten:

44

Der folgende Befehl gibt jede Skriptzeile an Write-Debug-

Set-PSDebug -Trace 1

Von man Set-PSDebug

Wenn der Trace-Parameter auf 1 gesetzt ist, wird jede Skriptzeile bei ihrer Ausführung verfolgt. Wenn der Parameter auf 2 gesetzt ist, werden auch Variablenzuweisungen, Funktionsaufrufe und Skriptaufrufe verfolgt. Wenn der Parameter Step angegeben ist, werden Sie vor der Ausführung jeder einzelnen Zeile des Skripts aufgefordert.

SpongeBoy
quelle
Wenn Sie dies einem Skript hinzufügen, das verwendet wird Param, stellen Sie sicher, dass diese Zeile unter dem parametrisierenden Block steht, da dies sonst zu Fehlern führen kann.
kayleeFrye_onDeck
4

Wo ich echo onin CMD verwendet habe, verwende ich jetzt Write-Verboseund Set-PSDebug -Stepstattdessen. Sie sind nicht dasselbe, aber sie sind mächtiger, wenn sie geschickt eingesetzt werden.

Jay Bazuzi
quelle
2

Hässlich:

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 >

Das Problem mit dem oben genannten ist, dass, wenn Sie mehrzeilige Befehle wie folgt haben:

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

Das obige wird mit meinem obigen Beispiel scheitern, wenn es mit dieser Struktur in foo.ps1 platziert ist ...

Marco Shaw
quelle
Ja, ich finde immer wieder solche halben Lösungen. Ich glaube wirklich, dass es keine "Silberkugel" für das gibt, was ich will. Vielen Dank, dass Sie mit diesen Lösungen kreativ sind. Ich habe jetzt ein paar Optionen und muss mich entscheiden, wohin ich von hier aus gehe.
Nelson Rothermel
2
help about_History 

Ich erzähle Ihnen von allen Befehlen und

Get-History [options]  

Die vollständige Liste wird zurückgegeben, damit Sie \ display usw. bearbeiten können.

Helvick
quelle
2
Ich habe "set-psdebug -trace 1" gefunden, das die Befehle anzeigt, aber viel zusätzliches "Rauschen" möchte ich nicht. get-history gibt in einem Skript nichts aus. Wenn es so wäre, könnte ich es am Ende eines Skripts festhalten, aber dann wären die Befehle nicht in der Zeile (vor der Befehlsausgabe) und alle Ausnahmen würden es überspringen (es sei denn, ich fange es natürlich ab). Es ist immer noch gut zu bedenken ... Irgendwelche anderen Ideen?
Nelson Rothermel
Ah - meinen Sie, dass Sie die Eingabe und die Ausgabe erfassen möchten, oder zumindest die Eingabebefehle, unmittelbar gefolgt von der entsprechenden Ausgabe, wiederholen möchten? Eine Möglichkeit, dies zu tun, besteht darin, die Ergebnisse in ein Array zu verschieben und dann die Get-History-Ergebnisse zu durchlaufen, wobei der Befehl gefolgt von der Ausgabe ausgegeben wird.
Helvick
start-transcript kann auch das tun, wonach Sie suchen, ist jedoch nur auf den Konsolentext der Aktion beschränkt.
Helvick
Sie haben es - genauso wie eine Batch-Datei funktioniert. Wir haben jetzt eine Reihe von Batch-Dateien und ich suche nach Möglichkeiten, diese durch PowerShell-Skripte zu ersetzen. Wir haben Software zum Planen, Verwalten des Ausgabeverlaufs usw. Ohne das Echo des Eingabebefehls ist das Debuggen schwieriger. Ich vermute, um die Ergebnisse zu verbessern, müssen Sie dies bei jedem Befehl tun, sicherstellen, dass Sie Ausnahmen abfangen usw., damit Sie nichts verpassen. Eine andere Option, aber nicht ganz das, wonach ich suche. Möglicherweise müssen wir nur eine Option auswählen und damit fortfahren.
Nelson Rothermel
Ich habe Start-Transcript ausprobiert, aber es hat nur protokolliert, dass es gestartet / gestoppt wurde, aber nichts dazwischen. Ich habe irgendwo gelesen, dass es für interaktive Befehle gedacht ist.
Nelson Rothermel