2017-07-24 3 views
4

Ich lerne PowerShell und verwendete Write-Host, um Variablenzuweisungen in einer neuen PowerShell-Skriptdatei zu überprüfen. Dann las ich diesen Artikel: http://windowsitpro.com/blog/what-do-not-do-powershell-part-1Wie kann ich mit PowerShell die Write-Debug-Ausgabe in der Konsole anzeigen lassen?

Also, meine PS1-Datei, die ich Aussagen wie diese ersetzt:

Write-Host "Start" 
Write-Host "End" 

... mit diesem:

Write-Debug "Start" 
Write-Debug "End" 

Aber wenn ich das lief Gespeichertes Skript in Windows PowerShell ISE wurde keine Ausgabe in die Konsole geschrieben. Ich beigefügten debug auf die Erklärung, die das Skript aufruft, etwa so:

PS E:\trialrun> .\MyScript.ps1 -debug 

Aber auch hier ist die Ausgabe nicht an die Konsole geschrieben werden. Anscheinend verwende ich Write-Debug falsch. Wie kann ich die Debugausgabe dazu bringen, auf die Konsole zu schreiben? Vielen Dank.

+0

ändere 'Write-Debug 'Start'' zu 'Write-Debug 'Start" -debug' im Skript (anstatt zu versuchen, es beim Aufruf des Skripts zu binden), mache dasselbe mit dem Ende. Oder überprüfen Sie [diese Antwort auf Bindungsparameter] (https://stackoverflow.com/questions/10159066/print-debug-messages-to-console-from-a-powershell-function-that-returns/10159250#10159250) wie debuggen. – JGreenwell

Antwort

6

tl; dr:

  • Run $DebugPreference = 'Continue' beginnen Ausgabe von Write-Debug Anrufe zu sehen.

  • Wenn Sie, Präferenzwert Variable $DebugPreference auf die Standardwiederherstellung durchgeführt, unter Verwendung von $DebugPreference = 'SilentlyContinue'


Ob Ausgabe von Write-Debug Aussagen gedruckt wird durch zwei Mechanismen gesteuert:

$DebugPreference standardmäßig SilentlyContinue, weshalb Sie keine Ausgabe von Write-Debug Aussagen standardmäßig nicht sehen, erklärt.

Wenn Sie gemeinsamen Parameter -Debug, Sie setzen im Grunde $DebugPreferencefür den aufgerufenen Befehl nur, und Sie immer stellen Sie den Wert Inquire, die nicht nur drucktWrite-Debug Nachrichten, aber auch pausiert bei jeder solchen Anweisung zu fragen, wie Sie fortfahren möchten.

  • Bei einer benutzerdefinierten Skript oder Funktion der -Debug gemeinsamen Parameter zu unterstützen, muss sich mit dem [CmdletBinding()] Attribute für seinen param() Block, wie Mathias' answer zeigt deklariert werden.

Da diese Aufforderung-at-every- Write-Debug -Aufruf Verhalten störend, kann $DebugPreference = 'Continue' kann der bessere Ansatz sein.

8

Sie erhalten eine CmdletBinding Attribut in Ihrem Skript benötigen, wenn Sie für gemeinsame Parameter unterstützen möchten (einschließlich -Debug):

[CmdletBinding()] 
param() 

Write-Debug Start 
Write-Debug End 

Ich würde vorschlagen, einen Blick auf die about_Functions_CmdletBindingAttribute Hilfedatei mit

+0

Das ist im Allgemeinen ein guter Rat, aber im Gegensatz zu anderen allgemeinen Parametern wie'ErrorAction' erlaubt '-Debug' nicht, einen _spezifischen Wert_ für die implizite, $ scannende' $ DebugPreference'-Variable zu übergeben und setzt stattdessen unausweichlich Es bedeutet 'Inquire', was bedeutet, dass jede gefundene 'Write-Debug'-Anweisung _prompt_ ist, was störend ist, wenn Ihre einzige Absicht es ist, _print_ Debug-Nachrichten zu schreiben. – mklement0

-1

I Verwenden Sie write-output anstelle von write-host, und das wird auf die Konsole gedruckt. write-verbose ist eine andere Option.

Lesen Sie diesen Artikel für weitere Informationen http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/

EDIT: ich informiert worden, dass mein Ansatz ist schlecht. Bitte beachten Sie die folgenden Kommentare aus Gründen warum.

+1

'Write-Output' schreibt in den _success_Ausgabestrom, wo die Ausgabe _by default_ ist (explizite Verwendung von' Write-Output' wird grundsätzlich nur benötigt, wenn Sie eine Kollektion als einzelnes Objekt mit '-NoEnumerate' ausgeben müssen). Sie sollten definitiv keine _debug_ Nachrichten an den Erfolgsstrom senden. Letzteres ist für _results_ (Daten). – mklement0

+0

@ mklement0 Ich denke, das stimmt, wenn Sie ein Cmdlet schreiben. Write-output und write-worse arbeiten für mich, da ich meine Skripte nicht in eine Pipeline lege. Sie werden nur als eigenständige Skripte ausgeführt. – DeanOC

+0

'Write-Output' (Strom' 1'), 'Write-Debug' (Strom' 5') und 'Write-Verbose' (Strom' 5') alle zielspezifischen Ströme mit unterschiedlichen Zwecken. Es geht nicht nur darum, Cmdlets zu schreiben, es gilt sogar, wenn Sie nur die Ausgabe speichern (was technisch immer noch eine _pipeline_ der Länge _1_ ist): Wenn Sie ein benutzerdefiniertes Skript aufrufen, das über den Erfolg sowohl Ergebnisse als auch Debug-Meldungen ausgibt Strom, was Sie erfassen, wird offensichtlich "verschmutzt" sein. Ich war nicht derjenige, der die Abstimmung abgelehnt hat, aber wenn Sie diese Antwort so lassen, wie sie ist, werde ich es auch tun (und obwohl es vielleicht nicht offensichtlich ist, lasse ich Sie als Höflichkeit wissen). – mklement0

Verwandte Themen