Unterschiedliche Darstellung von stdout in Powershell und Batch
Hallo,
mit Powershell3 rufe ich ein Kommandozeilentool auf, dass mir auf stdout eine Fortschritts-Info in Prozenten gibt. Das Problem ist, dass die Shell mir für jede Prozentänderung eine neue Zeile ausgibt:
Wenn ich mittels Batch das Tool mit den identischen Parametern anspreche, sehe ich die Fortschrittsanzeige nur auf einer Zeile. D. h. die Prozentzahlerneuert sich forlaufend:
Grundsätzlich also die Frage: woran kann das liegen?
Und falls das nicht lösbar ist: Gibt es einen Weg der Shell zu sagen, dass alle Informationen auf stdout, die "%" beinhalten, auf einer Zeile dargestellt werden? Und wenn ja, kann man die sich verändernde Prozentzahl in irgendeinerweise innerhalb eine Form als Text / Label darstellen und mit einer Art TimerOnTick aktualisieren lassen, bis das Ganze die 100% erreichjt?
Oder ist es, im Idealfall möglich, möglich die Prozentangaben als Grundlage für eine Progressbar einsetzen? Als weitere Schwierigkeit kommt hinzu, dass ich die Informationen, da die das Tool nach Abschluss (100%) auf stdout bzw. stderr ausgibt, unbedingt brauche und diese durch das "Einzeiligmachen" nicht verlieren darf.
Vielen Dank im Voraus!
mit Powershell3 rufe ich ein Kommandozeilentool auf, dass mir auf stdout eine Fortschritts-Info in Prozenten gibt. Das Problem ist, dass die Shell mir für jede Prozentänderung eine neue Zeile ausgibt:
Wenn ich mittels Batch das Tool mit den identischen Parametern anspreche, sehe ich die Fortschrittsanzeige nur auf einer Zeile. D. h. die Prozentzahlerneuert sich forlaufend:
Grundsätzlich also die Frage: woran kann das liegen?
Und falls das nicht lösbar ist: Gibt es einen Weg der Shell zu sagen, dass alle Informationen auf stdout, die "%" beinhalten, auf einer Zeile dargestellt werden? Und wenn ja, kann man die sich verändernde Prozentzahl in irgendeinerweise innerhalb eine Form als Text / Label darstellen und mit einer Art TimerOnTick aktualisieren lassen, bis das Ganze die 100% erreichjt?
Oder ist es, im Idealfall möglich, möglich die Prozentangaben als Grundlage für eine Progressbar einsetzen? Als weitere Schwierigkeit kommt hinzu, dass ich die Informationen, da die das Tool nach Abschluss (100%) auf stdout bzw. stderr ausgibt, unbedingt brauche und diese durch das "Einzeiligmachen" nicht verlieren darf.
Vielen Dank im Voraus!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 240851
Url: https://administrator.de/forum/unterschiedliche-darstellung-von-stdout-in-powershell-und-batch-240851.html
Ausgedruckt am: 14.05.2025 um 11:05 Uhr
3 Kommentare
Neuester Kommentar
Moin,
Leite doch einfach mal die Ausgabe in eine Textdatei um und schau, ob beidesmal dieselben Steuerzeichen generiert werden.
ich vermute daß das Programm einfach nru ein "CR" (Zeilenrücklauf) ausgibt udn die Poweshell das fgleich mit "neue Zeile" interpretiert was eigentlich ein "CRLF" (Zeilenrücklauf mit Vorschub) wäre.
Da wird man nicht viel tun können, außer die Ausgabe eventuell durch eine Filter wie z.B. sed zu leiten, der das dann zurchtbiegt.
lks
Leite doch einfach mal die Ausgabe in eine Textdatei um und schau, ob beidesmal dieselben Steuerzeichen generiert werden.
ich vermute daß das Programm einfach nru ein "CR" (Zeilenrücklauf) ausgibt udn die Poweshell das fgleich mit "neue Zeile" interpretiert was eigentlich ein "CRLF" (Zeilenrücklauf mit Vorschub) wäre.
Da wird man nicht viel tun können, außer die Ausgabe eventuell durch eine Filter wie z.B. sed zu leiten, der das dann zurchtbiegt.
lks
Hallo mqlman,
in Powershell kann man den Output einer Konsolenanwendung mit der folgenden Methode kontinuierlich abfragen:
(In Zeile 2 das Programm eintragen und in Zeile 3 die Parameter)
In der Schleife die so lange läuft bis das Programm beendet wurde, wird dann der Raw-Output im StdOut des Programms gecaptured und über ein Regex geleitet was die Prozentzahl extrahiert. Diese kann man dann nach Wunsch weiterverarbeiten (im Beispiel wird eine Powershell-Progressbar angezeigt). Alternativ kömmte man das ganze auch mit einer WinForms-Oberfläche kombinieren wie ich es bereits hier mit einer Progressbar gezeigt habe: Powershell GUI bleibt während einer While schleife hängen...
Grüße Uwe
in Powershell kann man den Output einer Konsolenanwendung mit der folgenden Methode kontinuierlich abfragen:
(In Zeile 2 das Programm eintragen und in Zeile 3 die Parameter)
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "ping.exe"
$pinfo.Arguments = "localhost -t"
$pinfo.UseShellExecute = $false
$pinfo.CreateNoWindow = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.RedirectStandardError = $true
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $pinfo
$process.Start() | out-null
while(!$process.HasExited){
[int]$percent = ([regex]"[\d\.]+").Match($process.StandardOutput.ReadLine()).Value
Write-Progress -Activity "Programm läuft..." -CurrentOperation "$percent% abgeschlossen" -Status "Bitte warten." -PercentComplete $percent
sleep(1)
}
Grüße Uwe