Durante la chiamata a .NET [Console]::ReadLine()
viene rilevata una perdita di dati irreversibile per leggere l'input con pipe su PowerShell.exe. In CMD, eseguire:Il testo inviato a PowerShell.exe non viene ricevuto quando si utilizza [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
Normalmente 'ping localhost' dal Vista64 si presenta così, quindi c'è un sacco di dati mancanti dal uscita di cui sopra:
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
ma usando la stessa API da C# riceve tutti i dati inviati al processo (escluse alcune differenze di nuova riga). Codice:
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);
}
}
}
}
uscita:
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
Quindi, se chiamate la stessa API da PowerShell invece di C# molte parti del StdIn get 'mangiato'. L'host PowerShell sta leggendo una stringa da StdIn anche se non ho usato "PowerShell.exe -Command -"?
ho ottenuto un errore: "Un'espressione era attesa dopo '('". Se corro questo sotto PowerShell. Correggere la tua domanda per specificare CMD. Le tue domande sono piene di dettagli (grazie!) ma non potresti avere un po 'di cose semplificate rimuovendo il bit 'Get-Date'? –
Confermo che i risultati sono intermittenti/inaffidabili: sembra essere basato sulla velocità, se 'ping' viene sostituito con qualcosa di più veloce (' tipo foo.txt'), non ottengo output.Se io uso qualcosa di lento ('copia con') ottengo tutto –
@JayBazuzi Il timestamp per linea è stato l'unico motivo per cui ho dovuto eseguire il piping attraverso PowerShell in primo luogo. ;) – yzorg