2016-12-25 5 views
5

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. Zum Beispiel würden Sie in Bash bash -x myscript schreiben oder einen set -x an der Spitze Ihres Skripts platzieren. In Batch würden Sie die auslassen, die traditionell oben in Ihrem Skript steht. Hat PowerShell ein Äquivalent dieser Konstrukte?Wie wird ein PowerShell-Skript mit ausführlicher Ausgabe ausgeführt?

Dinge, die ich versucht habe: Laufen powershell -? | sls verbose, die nichts ergab.

+0

An erster Stelle sollte ein Benutzer mit Ihrem Vertreter etwas Recherche durchgeführt haben, bevor Sie fragen? [google: Echo auf powershell] (http://www.google.com/search?q=Echo+auf+powershell&oq=Echo+auf+powershell) – LotPings

+1

@LotPings Entschuldigung, es ist mir nicht in den Sinn gekommen zu Google "Echo für Powershell". –

Antwort

12

Geht einfach zu zeigen, @JamesKo, wenn Sie die falsche Frage stellen, bekommen Sie die falsche Antwort :-(. Mehrere Menschen legen gute Glauben Antworten hier basierend auf (a) Mangel an Linux-Exposition und (b) Ihre Verwendung des Begriffs wortreich Im Folgenden werde ich Ihnen erklären, wie Linux zu diesem Thema mit PowerShell in Verbindung steht, aber zögern Sie nicht, am Ende auf die Antwort zu springen, wenn Sie es eilig haben.

Hintergrund

In Powershell, die ausführlichen eine ganz bestimmte Bedeutung hat, die die PowerShell man page noch eher vage ist:

Zeigt detaillierte Informationen über den Vorgang an, der mit dem Befehl ausgeführt wird. Diese Information ähnelt der Information in einer Ablaufverfolgung oder einem Transaktionsprotokoll. Dieser Parameter funktioniert nur, wenn der Befehl eine ausführliche Nachricht generiert.

Es klingt sogar wie, was Sie wollen ...aber lassen Sie uns vergleichen Sie das mit der Linux-Dokumentation für set -x, die je nach Ihrem Geschmack von Linux, könnte dies (von man-pages project) ...

Die Schale für jeden Befehl auf Standardfehler eine Spur schreiben wird nach es erweitert den Befehl und bevor er ausgeführt wird.

oder diese (von gnu) ...

Drucken eine Spur von einfachen Befehlen, Befehle, Kommandos Fall, wählen Sie Befehle und Rechnen für Befehle und ihre Argumente oder zugehörigen Wortlisten nachdem sie erweitert sind und bevor sie ausgeführt werden.

Die erste Zeile Ihrer Frage stimmt klar und prägnant mit diesen überein. In PowerShell ist dies jedoch anders. Kurz gesagt: Wenn Sie den ausführlichen Modus aktivieren (sei es mit der Befehlszeilenoption -Verbose oder der Variablen $VerbosePreference), wird einfach die Ausgabe des ausführlichen Streams an die Konsole aktiviert. (Genau wie Linux zwei Streams bietet, stdout und stderr, bietet PowerShell mehrere Streams: Ausgabe-Stream, Fehler-Stream, Warn-Stream, ausführlicher Stream und Debug-Stream. Sie arbeiten mit diesen Streams auf die gleiche Weise wie Linux - Sie können verwenden, selbst, zum Beispiel commands 4>&1 die ausführlichen Stream stdout zu verschmelzen, zum Beispiel. (Sie können mehr über Powershell mehr Ausgabeströme im Grunde Schreiben Streams Abschnitt PowerShell One-Liners: Accessing, Handling and Writing Data lesen und eine gute schnelle Referenz werden die Complete Guide to PowerShell Punctuation.)

Die Antwort

Mit dem Befehl Set-PSDebug erhalten Sie bash-äquivalentes Tracing.Sie können sogar das Tracing-Detail mit deranpassenParameter. Als erstes ist hier die Kontrolle, bevor Set-PSDebug mit:

PS> Get-PSDepth 
0 

Mit einem Wert von Sie jede Codezeile erhalten, wie es ausführt, zum Beispiel:

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 Sie erhalten 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+ >>>> } 

Das sind die Spuren eines simp le cmdlet schrieb ich Get-PSDepth. Es druckt die Befehle, Zuweisungen usw. mit dem Präfix DEBUG, vermischt mit der tatsächlichen Ausgabe, die in diesem Fall die einzige Zeile ist, die nur 0 enthält.

0

Wenn Sie mit Schreib ausführliche in Ihre Skripte dies automatisch geschehen,

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

5

Sie können immer die unten in Ihrem Skript verwenden.

$ VerbosePreference = "Weiter"

Hinweis: Sie haben die Schale in erweiterten Modus zu öffnen.

Unten Screenshot ist als Referenz.

$VerbosePreference

Hoffe, es hilft.

0

Das ist eigentlich sehr einfach, denn jedes PowerShell CMDLET hat ein eingebautes Verbose-Tag. Alles, was Sie haben zum Beispiel zu tun:

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

das ist es. Ich hoffe, das hilft

Verwandte Themen