使用[Console] :: ReadLine()时未收到通过PowerShell.exe传送的文本

yzo*_*org 5 powershell command-line

我在调用.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

通常来自Vista64的"ping localhost"看起来像这样,因此上面的输出中缺少大量数据:


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

但是,使用C#中的相同API会接收发送到进程的所有数据(不包括某些换行符).码:

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);
            } 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

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

因此,如果从PowerShell调用相同的API而不是C#,StdIn的许多部分都会被"吃掉".PowerShell主机是否从StdIn读取字符串,即使我没有使用'PowerShell.exe -Command - '?

Joe*_*oey 5

您可以使用$inputPowerShell中的枚举器来访问通过管道传输到程序中的数据.我也发现[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
Run Code Online (Sandbox Code Playgroud)

  • @Steven:`$ input`是一个迭代器,而不是一个数字.您可以使用`$ input |%{'{0:x}' - f $ _}`,`'{0:x}' - f +"$ input"`,`'{0:x}'的各种变体-f @($ input)[0]`,...取决于你想要实现的目标. (2认同)