避免cmd输出末尾换行



当我在cmd中使用此命令pwsh -c echo hello时,我会得到以下输出:

C:>pwsh -c echo hello
hello
C:>

我最后没有断线当我在powershell上运行它时:

PS C:> pwsh -c echo hello
hello
PS C:>

所以我认为问题出在cmd上。我知道这不是一个问题,有一个简单的解决方案,但我有一些程序使用cmd访问powershell,删除换行符并不是那么有趣。那么,是否有任何修复方法可以阻止cmd添加该行?

Mofi在评论中提供了关键的指针:

  • 交互执行命令时,cmd.exe会无条件地在命令的输出中附加一个换行符,这可能是为了可读性,也可能是为了确保下一个提示总是从新行开始。

    • 无论该命令是什么,这都适用。换句话说:您的命令恰好是PowerShell命令并不重要
  • 但是,尾随换行符不会成为命令输出的一部分,因此对命令输出的编程处理不会受到影响,例如当您将>重定向到文件或使用for /f逐个处理输出行时。

    • 换句话说:对于编程处理,您需要而不是删除尾部换行符,因为它不是实际命令输出的一部分。

    • 相反,如果您真的需要有效地抑制显示的尾随换行符,则必须修改命令的输出(如果这是一个选项的话(,这样输出本身就不会以换行符结束,如cmd.exe自己的echo命令的SuperUser答案所示;对于PowerShell,可以执行pwsh -c Write-Host -NoNewLine hello


边缘情况

当从运行而不带@echo off(或带echo on(的批处理文件捕获输出时,在这种情况下,尾随换行符将成为输出的一部分,您可以通过管道连接到findstr /r /v /c:"^$"来过滤空行(也如链接答案中所示(;例如

foo.cmd | findstr /r /v /c:"^$"

但是,请注意,所有空行都是通过这种方式过滤掉的——可能会在批处理文件执行的命令的输出中包括实际的空行。

如果需要防止这种情况发生,则需要一种更复杂的方法,然而,该方法(a(依赖于正在使用的标准提示字符串(例如,C:>(,并且(b(仍然会产生误报:

foo.cmd | powershell -nop -c "@($Input) -join "`n" -replace 'n(?=[a-z]:\.*?>)'"

最后要注意的是,如果您在不捕获或重定向其输出的情况下执行上述命令,则cmd.exe控制台中的整体输出将再次出现一个尾随换行符。

最新更新