避免在 cmd 输出末尾换行?

Avoid Line break at end of cmd output?

当我在 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 命令并不重要。
  • 但是,尾随的换行符不会成为命令输出的一部分,因此程序化处理 的命令输出 受影响 ,例如当您将 > 重定向到文件或使用 [=14 逐行处理输出行时=].

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

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


边缘情况

批处理文件 捕获输出时 运行 没有 @echo off(或 echo on) - 在这种情况下,尾随换行符 do 成为输出的一部分 - 您可以通过管道过滤掉空行 findstr /r /v /c:"^$" (也如链接答案所示);例如

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

但是,请注意 all 空行以这种方式过滤掉 - 可能包括 actual 空行批处理文件。

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

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

最后请注意,如果您执行上述命令而不捕获或重定向它们的输出,它们在 cmd.exe 控制台中的整体输出将再次有一个尾随换行符。