【问题标题】:How to remove extra lines from the command output?如何从命令输出中删除多余的行?
【发布时间】: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! " }。这样您就不必担心将单独的换行符作为对象进行管道传输。

标签: powershell powershell-5.0


【解决方案1】:

这对我有用:

&{ py -3 -c "for i in range(2): print(f'{i}\r', end='')" ; Write-Output "" ; Write-Output "Done!" }

所以我删除了“\n”,因为它触发了一个新行,但是你已经用“\r”触发了一个返回。

我得到以下输出:

0
1

Done!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2021-04-01
    • 2020-09-27
    • 2022-10-15
    • 2012-05-11
    相关资源
    最近更新 更多