Ich bekomme itermittent Datenverlust beim Aufrufen .NET [Console]::ReadLine()
zu piped Eingabe in PowerShell.exe zu lesen. In CMD läuft:Text piped zu PowerShell.exe wird nicht empfangen, wenn [Console] :: ReadLine()
>ping localhost | powershell -NonInteractive -NoProfile -C "do {$line = [Console]::ReadLine(); ('' + (Get-Date -f 'HH:mm :ss') + $line) | Write-Host; } while ($line -ne $null)" 23:56:45time<1ms 23:56:45 23:56:46time<1ms 23:56:46 23:56:47time<1ms 23:56:47 23:56:47
Normalerweise 'ping localhost' von Vista64 wie folgt aussieht, so gibt es eine Menge von Daten aus der Ausgabe fehlen oben:
Pinging WORLNTEC02.bnysecurities.corp.local [::1] from ::1 with 32 bytes of data: Reply from ::1: time<1ms Reply from ::1: time<1ms Reply from ::1: time<1ms Reply from ::1: time<1ms Ping statistics for ::1: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 0ms, Maximum = 0ms, Average = 0ms
Aber mit der gleichen API von C# empfängt alle an den Prozess gesendeten Daten (mit Ausnahme einiger Zeilenumbrüche). Code:
namespace ConOutTime {
class Program {
static void Main (string[] args) {
string s;
while ((s = Console.ReadLine()) != null) {
if (s.Length > 0) // don't write time for empty lines
Console.WriteLine("{0:HH:mm:ss} {1}", DateTime.Now, s);
}
}
}
}
Ausgang:
00:44:30 Pinging WORLNTEC02.bnysecurities.corp.local [::1] from ::1 with 32 bytes of data: 00:44:30 Reply from ::1: time<1ms 00:44:31 Reply from ::1: time<1ms 00:44:32 Reply from ::1: time<1ms 00:44:33 Reply from ::1: time<1ms 00:44:33 Ping statistics for ::1: 00:44:33 Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 00:44:33 Approximate round trip times in milli-seconds: 00:44:33 Minimum = 0ms, Maximum = 0ms, Average = 0ms
Also, wenn die gleiche API von Powershell anstelle von C# viele Teile StdIn 'gegessen' get rufen. Liest der PowerShell-Host eine Zeichenfolge aus StdIn, obwohl ich "PowerShell.exe-Befehl -" nicht verwendet habe?
ich einen Fehler bekam: „Ein Ausdruck nach‚(‘erwartet wurde.“ Wenn ich laufen dies unter PowerShell. Reparieren Sie Ihre Frage, um CMD zu spezifizieren. Ihre Fragen sind voller guter Details (danke!), aber konnten Sie nicht etwas Dinge vereinfachen, indem Sie das "Get-Date" -Bit entfernen? –
Ich bestätige, dass die Ergebnisse sind intermittierend/unzuverlässig.Es scheint auf Geschwindigkeit beruhend.Wenn "ping" durch etwas schneller ersetzt wird ('type foo.txt'), bekomme ich keine Ausgabe.Wenn ich etwas langsam benutze (' copy con') bekomme ich alles –
@JayBazuzi Der Zeitstempel pro Zeile war der einzige Grund, warum ich überhaupt durch Powershell gepumpt habe. ;) – yzorg