避免在 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
控制台中的整体输出将再次有一个尾随换行符。
当我在 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
控制台中的整体输出将再次有一个尾随换行符。