【发布时间】:2021-01-04 18:31:00
【问题描述】:
以下命令输出 4 行:
PS C:\> &{ py -3 -c "for i in range(2): print(f'{i}\r\n', end='')" ; Write-Output "" ; Write-Output "Done!" }
0
1
Done!
我需要处理输出(添加一些信息,如时间戳、级别等):
PS C:\> $c=0 ; &{ py -3 -c "for i in range(2): print(f'{i}\r\n', end='')" ; Write-Output "" ; Write-Output "Done!" } | %{ Write-Host ('{0:d3} : {1}' -f (++$c),$_) }
001 : 0
002 :
003 : 1
004 :
005 :
006 : Done!
但现在有一些额外的行 - 002、004。
我怎样才能得到以下输出:
001 : 0
002 : 1
003 :
004 : Done!
?
脚本块&{ }内的外部命令(如py)可能以任意顺序与PowerShell命令混合。
【问题讨论】:
-
不要使用
Write-Host,因为它不关心管道。 -
它在管道的末端,我需要它。
-
常见添加 |其中 {$_} 过滤掉空行
-
没有
Write-Host的代码产生6 行。因此,您所看到的是设计和预期的。这 3 个“空白”行中的每一个都具有相同的输出。由于没有区别,因此您必须在逻辑上创建一个区别。我要么像$c=0; &{ py -3 -c "for i in range(2): print(f'{i}\r\n', end='')" ; Write-Output "<Remove>" ; Write-Output "Done! " } | Where {$_} | %{ Write-Host ('{0:d3} : {1}' -f (++$c),($_ -replace '<Remove>')) }那样使用创可贴,要么只使用不同的分隔符策略。 -
由于在 Windows 中默认的换行顺序是 CRLF,你可以使用
&{ py -3 -c "for i in range(2): print(f'{i}\n', end='')" ; Write-Output "" ; Write-Output "Done! " }。这样您就不必担心将单独的换行符作为对象进行管道传输。