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