Текст, переданный по каналу к PowerShell.exe, не получен при использовании [Консоль]:: ReadLine ()

Я получаю itermittent потерю данных при вызове.NET [Console]::ReadLine() считать переданный по каналу вход в PowerShell.exe. В CMD, выполненном:

>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

Обычно 'проверяют с помощью ping-запросов localhost' от Vista64, похож на это, таким образом, существует много данных, отсутствующих в выводе выше:


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

Но использование того же API от C# получает все данные, отправленные в процесс (исключая некоторые различия в новой строке). Код:

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);
            } 
        }
    }
}

Вывод:

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

Так, при вызове того же API от PowerShell вместо C# 'едят' много частей StdIn. PowerShell, размещают строку чтения от StdIn даже при том, что я не использовал 'PowerShell.exe - Команду -'?

5
задан mklement0 31 July 2016 в 23:03
поделиться

3 ответа

Вы можете использовать перечислитель $ input в PowerShell, чтобы получить доступ к данным, переданным в программу. Я также обнаружил, что [Console] :: ReadLine () каким-то образом почти ничего не делает. Однако причины этого неизвестны.

C:\Users\Me> ping localhost | powershell -noninteractive -noprofile -c "$input|%{(date -f HH:mm:ss)+' '+$_}"

07:31:54
07:31:54 Pinging Sigmund [::1] with 32 bytes of data:
07:31:54 Reply from ::1: time<1ms
07:31:54 Reply from ::1: time<1ms
07:31:54 Reply from ::1: time<1ms
07:31:55 Reply from ::1: time<1ms
07:31:55
07:31:55 Ping statistics for ::1:
07:31:55     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
07:31:55 Approximate round trip times in milli-seconds:
07:31:55     Minimum = 0ms, Maximum = 0ms, Average = 0ms

C:\Users\Me>ping localhost

Pinging Sigmund [::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
6
ответ дан 14 December 2019 в 08:44
поделиться

Одно из возможных решений:

powershell -NonInteractive -NoProfile -C  "ping localhost | % { ('' + (Get-Date -f 'HH:mm:ss') + $_) | Write-Host; }"

Я добавляю его для ответов на другие вопросы посетителей, потому что я думаю, у вас были некоторые причины, по которым вы его не используете :)

1
ответ дан 14 December 2019 в 08:44
поделиться

Я представляю свое окончательное решение, хотя это и не совсем ответ на мой первоначальный вопрос. Я пытался передать данные в powershell из среды cmd.exe, которая имела кучу специализированных инструментов (см. www.streambase.com). В конце концов я добавил эти инструменты в свою среду powershell.

В итоге я вызвал внешний инструмент из PowerShell и передал данные в расширенную функцию Out-Time...

function Out-Time { 
param (
    [parameter(ValueFromPipeline=$true)]
    $Value, 
    [switch] $OutputEmptyLines=$false) 
process {
    if (!$OutputEmptyLines -and ($Value -eq $null -or $Value -eq '')) {
    } 
    else {
        "{0} {1}" -f @((get-date -Format "HH:mm:ss.ff"), $Value)
    }
} 
}
#test
#ping localhost | Out-Time; ping localhost | Out-Time -OutputEmpty
0
ответ дан 14 December 2019 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: