it-swarm.com.de

Wie führe ich ein PowerShell-Skript mit ausführlicher Ausgabe aus?

Ich frage mich, ob es eine Möglichkeit gibt, ein PowerShell-Skript so auszuführen, dass sowohl die Befehle als auch die Ausgabe jeder Zeile des Skripts gedruckt werden. In Bash würden Sie beispielsweise bash -x myscript Schreiben oder ein set -x Am oberen Rand Ihres Skripts einfügen. In Batch würden Sie das @echo off, Das traditionell oben in Ihrem Skript steht, weglassen. Verfügt PowerShell über ein Äquivalent zu diesen Konstrukten?

Dinge, die ich versucht habe: Ausführen von powershell -? | sls verbose, Was nichts ergab.

15
James Ko

Nur um zu zeigen, @JamesKo, wenn Sie die falsche Frage stellen, erhalten Sie die falsche Antwort :-(. Mehrere Leute geben hier nach Treu und Glauben Antworten, basierend auf (a) mangelnder Linux-Präsenz und (b) Ihrer Verwendung des Begriffs wortreich. Im Folgenden werde ich Ihnen zeigen, wie Linux zu diesem Thema mit PowerShell umgeht. Wenn Sie es eilig haben, können Sie jedoch am Ende zur Antwort springen. :-)

Hintergrund

In PowerShell hat verbose eine ganz bestimmte Bedeutung, über die die PowerShell-Manpage sogar ziemlich vage ist:

Zeigt detaillierte Informationen zu dem vom Befehl ausgeführten Vorgang an. Diese Informationen ähneln den Informationen in einem Trace oder in einem Transaktionsprotokoll. Dieser Parameter funktioniert nur, wenn der Befehl eine ausführliche Nachricht generiert.

Es klingt sogar so, wie Sie es wollen ... aber vergleichen wir das mit der Linux-Dokumentation für set -x, Die, abhängig von Ihrer Linux-Version, dieses (von man-pages-Projekt sein könnte ) ...

Die Shell schreibt eine Ablaufverfolgung für jeden Befehl in den Standardfehler, nachdem sie den Befehl erweitert und bevor sie ihn ausführt.

oder dies (von gnu ) ...

Drucken Sie eine Spur einfacher Befehle für Befehle, Groß-/Kleinschreibung, Auswahlbefehle und Arithmetik für Befehle und deren Argumente oder zugehörige Wortlisten, nachdem sie erweitert wurden und bevor sie ausgeführt werden.

Die allererste Zeile Ihrer Frage stimmt klar und präzise mit diesen überein. Aber ausführlich in PowerShell ist anders. Kurz gesagt: Wenn Sie den ausführlichen Modus aktivieren (sei es mit der Befehlszeilenoption -Verbose Oder der Variablen $VerbosePreference), Wird die Ausgabe des ausführlichen Streams an die Konsole aktiviert. (Genau wie Linux zwei Streams anbietet, stdout und stderr, bietet PowerShell mehrere Streams: Ausgabestream, Fehlerstream, Warnstream, ausführlicher Stream und Debugstream. Sie arbeiten mit diesen Streams auf die gleiche Weise wie mit Linux - das können Sie Verwenden Sie beispielsweise sogar commands 4>&1, um den ausführlichen Stream mit stdout zusammenzuführen. (Weitere Informationen zu den verschiedenen PowerShell-Ausgabestreams finden Sie im Abschnitt Grundlegende Schreib-Streams von PowerShell One-Liners : Zugreifen auf, Behandeln und Schreiben von Daten und eine gute Kurzreferenz ist das vollständige Handbuch zur PowerShell-Interpunktion .

Die Antwort

Mit dem Befehl Set-PSDebug erhalten Sie eine bash-äquivalente Ablaufverfolgung. Sie können das Verfolgungsdetail sogar mit dem Parameter -Trace Anpassen. Hier ist zunächst das Steuerelement, bevor Sie Set-PSDebug Verwenden:

PS> Get-PSDepth
0

Mit einem Wert von 1 erhalten Sie jede Codezeile während der Ausführung, z.

PS> Set-PSDebug -Trace 1
PS> Get-PSDepth
DEBUG:    1+  >>>> Get-PSDepth
DEBUG:  141+  >>>> {
DEBUG:  142+   >>>> $nest = -1
DEBUG:  143+   >>>> $thisId = $pid
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  145+    >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG:  146+    >>>> $nest++
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  148+   >>>> $nest
0
DEBUG:  149+  >>>> }

Mit einem Wert von 2 erhalten Sie auch Variablenzuweisungen und Codepfade:

PS> Set-PSDebug -Trace 2
PS> Get-PSDepth
DEBUG:    1+  >>>> Get-PSDepth
DEBUG:     ! CALL function '<ScriptBlock>'
DEBUG:  141+  >>>> {
DEBUG:     ! CALL function 'Get-PSDepth'  (defined in file 'C:\Users\msorens\Documents\WindowsPowerShell\profile.ps1')
DEBUG:  142+   >>>> $nest = -1
DEBUG:     ! SET $nest = '-1'.
DEBUG:  143+   >>>> $thisId = $pid
DEBUG:     ! SET $thisId = '9872'.
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  145+    >>>> $thisId = (gwmi win32_process -Filter "processid='$thisId'").ParentProcessId
DEBUG:     ! SET $thisId = '10548'.
DEBUG:  146+    >>>> $nest++
DEBUG:     ! SET $nest = '0'.
DEBUG:  144+  while ( >>>> (ps -id $thisId).Name -eq 'powershell') {
DEBUG:  148+   >>>> $nest
0
DEBUG:  149+  >>>> }

Dies sind die Spuren eines einfachen Cmdlets namens Get-PSDepth, Das ich geschrieben habe. Es druckt die Befehle, Zuweisungen usw. mit dem Präfix DEBUG, gemischt mit der tatsächlichen Ausgabe, die in diesem Fall die einzige Zeile ist, die nur 0 Enthält.

23
Michael Sorens

Sie können immer das Folgende in Ihrem Skript verwenden.

$ VerbosePreference = "Continue"

Hinweis: Sie müssen die Shell im erhöhten Modus öffnen.

Der folgende Screenshot dient als Referenz.

$VerbosePreference

Ich hoffe es hilft.

14
Ranadip Dutta

Dies ist eigentlich sehr einfach. Jedes PowerShell-CMDLET verfügt über ein eingebautes Verbose-Tag. Alles was Sie zum Beispiel tun müssen:

Test-Connection -ComputerName www.google.com -Verbose

Das ist es. ich hoffe das hilft

1

Wenn Sie in Ihren Skripten ausführlich schreiben, geschieht dies automatisch.

Wenn Sie jedoch eine ausführliche Ausgabe Ihrer Funktionen manuell schreiben müssen, müssen Sie manuell überprüfen, ob jede Funktion mit dem ausführlichen Flag aufgerufen wird. Dies kann durch Überprüfen von $ PSCmdlet.MyInvocation.BoundParameters ["Verbose"] in Ihrer Funktion erfolgen.

0
Steve Rathbone