PowerShell Write-Output wird nicht angezeigt

Piktogramm

Admiral
Registriert
Okt. 2008
Beiträge
8.919
Moin ich habe in einem Powershellscript den Schnippsel
Code:
if (!(Test-Path "$target")){
        Write-Output "$target nicht gefunden erstelle Ordner"
        New-Item -ItemType Directory -Path $target > $null
}

Das Write-Output wird dabei nicht auf stdout bzw. der Shell ausgegeben. Wenn ich jedoch mit dem Debugger der Powershell-ISE Breakpoints setze, so wird die Zeile 2 definitiv erreicht und auch Zeile 3 wird ausgeführt (der durch $target definierte Ordner wird erstellt!).
Ähnliche Probleme habe ich mehrfach. Wobei sich das Problem mit kleinen Testscripten nicht zuverlässig reproduzieren lässt und das große Script enthält mir gerade zu viele Interna zum Veröffentlichen :/
 
Write-Host tut und ich lese gerade, dass die Powershell Write-Output eben nicht direkt zum Output schreibt.
Also Danke @FranzvonAssisi

Lustige WTF-Momente, wenn man nach Jahren *nix auf Windows versucht irgendwas zu machen. Alles gaga, Write-Output schreibt nicht nach stdout, muss man erstmal drauf kommen :)
 
Naja, grundsätzlich sollte es aber auch funktionieren, weil du es ja als letztes in der Pipeline hast :confused_alt:

Naja, wenns so funktioniert ist ja gut :D

Lg
 
Es funktionierte an mehreren Stellen nicht, bis zu einem Punkt, dass gelegentlich sogar eine Verzweigung ein nicht deterministisches Verhalten an den Tag legte [1]. Write-Host verhält sich hingegen wie gewünscht.
Nunja, etwas ausgeklärt wird es hier: https://www.itprotoday.com/powershell/write-output-or-write-host-powershell
Nachtrag:
Herje, Microsoft macht es ja wirklich arg kompliziert -.-
https://devblogs.microsoft.com/scri...ams-redirection-and-write-host-in-powershell/
/Nachtrag

Das sich da aber ein derartiges Verhalten ergeben kann o.O

[1] AHHHHHHHHHHHHHHHHH, dieser Selbstzweifel wenn die Logik bei einem simplen Bool nicht klappt.
 
Zuletzt bearbeitet:
Warum nicht über eine MessageBox ausgeben lassen?

PowerShell:
If (!(Test-Path "$target")){
    [Void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
    $OUTPUT = [System.Windows.Forms.MessageBox]::Show("$target nicht gefunden, erstelle Ordner.",'Achtung!!','OK','Exclamation')
    If ($OUTPUT -Eq 'OK'){New-Item -ItemType Directory -Path $target > $Null}
}
 
  • Gefällt mir
Reaktionen: areiland
Wieso sollte man seine Nutzer mit einem Interaktion erforderten Dialog belästigen, wenn man nur eine Statusmeldung auf den Bildschirm bringen will? Ganz abgesehen davon, dass bei solchen Dialogen die Ausgabeumleitung nur mittelprächtig funktioniert.
Danke für den Versuch, aber sowas gehört für mich zu den Totsünden bei der Entwicklung von Nutzerschnittstellen.
 
Na klar, das ist Geschmacksache. Es sollte auch nur eine weitere Option aufzeigen.
Warum es aber eine "Todsünde" darstellen soll, erschließt sich mir nicht so recht. Aber auch das ist Ansichtssache.

Derartige Dialoge funktionieren bei mir immer und nicht nur mittelprächtig. Es liegt nicht an der Art der Ausgabeumleitung, wenn es zu Problemen kommen sollte, sondern wahrscheinlich am Code insgesamt.

Der Unterschied zwischen "Write-Output" und "Write-Host" ist eigentlich klar definiert und wird von MS in der von dir verlinkten Dokumentation auf devblogs relativ einleuchtend erklärt.
 
Das ist doch keine Geschmackssache?! Ein Script soll Dinge automatisieren und vom Nutzer unabhängig laufen. Da Dialoge vorzusehen die den Prozess anhalten und auf eine Nutzerinteraktion warten die nur aus einem "OK" besteht. Ganz abgesehen davon müsste in diesem Fall irgendwer einen Mitarbeiter 10-240Minuten dafür bezahlen, dass er Dialoge mit nur der Option "Ok" wegklickt und einen Rechner beaufsichtigt.
Das ist schlechtes Design und nichts Anderes.

Ja Write-Output und Write-Host sind definiert. So soll Write-Output auf den Output / Sucess stream schreiben der von der Shell angezeigt wird. Nur das tut es eben nicht zuverlässig.

https://community.spiceworks.com/topic/1983494-write-output-not-showing-output-in-cli

Es gibt / gab auch ein paar Issues zum Verhalten von Write-Output aut Github
https://github.com/PowerShell/vscode-powershell/issues/151
https://github.com/PowerShell/PowerShellEditorServices/issues/138
https://github.com/PowerShell/vscode-powershell/issues/284

Oder einfach mal alle offenen Bugs mit Bezug zu Write-Output
https://github.com/PowerShell/vscode-powershell/issues?utf8=✓&q=write-output++is:open

Ich behaupte mal, mein Code ist nicht soooo schlecht, dass gerechtfertigt ist, dass Write-Output "foo" etwas anderes tut als es in der Dokumentation von Microsoft steht ;)
 
Piktogramm schrieb:
Da Dialoge vorzusehen die den Prozess anhalten und auf eine Nutzerinteraktion warten die nur aus einem "OK" besteht.
Deiner Schilderung zufolge hast du natürlich recht. Das ergibt in dem Szenario dann keinen Sinn.
 
Zurück
Oben