【问题标题】:Avoid Line break at end of cmd output?避免在 cmd 输出结束时换行?
【发布时间】:2022-08-20 21:53:54
【问题描述】:

当我在 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 添加该行?

  • Windows 命令处理器cmd.exe 总是在命令执行完成后输出一个空行,然后再显示下一个用户输入的提示。 Windows PowerShell powershell.exe 不这样做。因此,空行不是由执行pwsh -c echo hello 或只是echo hello 产生的,而是由cmd.exe 本身在您的情况下打印提示C:\\> 之前产生的。所以没有什么可以改变的。您可以通过在命令提示符窗口中运行来查看行为:echo Hello Yusef!& echo Is your question answered? 两个输出行之间没有空行,就在提示符上方。
  • 超级用户有问题How to stop the Windows command line from outputting an empty line after each command? 可以使用echo Hello Yusef!& set /P =Is your question answered?<nul 来获得没有空行的两行输出,因为提示文本Is your question answered? 输出时没有换行符,所以换行符) 由cmd.exe 在提示符终止带有输出提示文本的行之前输出。

标签: powershell cmd line-breaks


【解决方案1】:

Mofi 提供了 cmets 中的关键指针:

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

    • 无论该命令是什么,这都适用。换句话说:您的命令恰好是电源外壳命令。
  • 但是,尾随换行符确实不是成为命令输出的一部分,因此程序化处理命令的输出是不是做作的,例如当您将> 重定向到文件或使用for /f 逐行处理输出行时。

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

    • 相反,如果您真的需要抑制尾随换行符用于展示,你必须修改命令的输出- 如果这甚至是一个选项 - 以便输出本身不会以换行符结尾,如 this SuperUser answercmd.exe 自己的 echo 命令所示;对于 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 控制台中的整体输出将再次有一个尾随换行符。

【讨论】:

    猜你喜欢
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    相关资源
    最近更新 更多