避免使用echo中的换行符

mat*_*thk 32 powershell

目前在PowerShell中,echo命令始终附加换行符.什么是Unix的等价物echo -n

And*_*ndi 36

echo是一个别名,Write-Output它将对象发送到管道中的下一个命令.如果您只想在控制台上显示文本,您可以执行以下操作:

Write-Host "Hi" -NoNewLine

请记住,这与echo | Write-Output的cmdlet不同.

Write-Output主要目的是将对象发送到管道中的下一个命令,其Write-Host主要目的是在控制台上显示文本.您在控制台上看到文本的原因Write-Output是PowerShell引擎将所有内容发送到Out-Default管道的末尾,该管道将传入PowerShell的对象发送到文本格式化引擎.

这是一个例子:

Write-Host "hi" | Get-Member
Run Code Online (Sandbox Code Playgroud)

这将产生错误,因为Write-Host只是将文本写入控制台并且不将字符串转发到管道中的下一个命令.

Write-Output "hi" | Get-Member
Run Code Online (Sandbox Code Playgroud)

这将显示System.String属性和方法,因为Write-Outputstring对象发送到管道中的下一个对象.


mkl*_*nt0 7

补充安迪·阿里斯门迪的有用回答

  • 在 Bash 中,echo -n(或其可移植的等价物printf %s)将其参数发送到数据(输出)流stdout

  • PowerShell 等价于 Unix 标准输出流是它的成功流默认情况下命令的输出会流向该
    请注意,PowerShell 可以将任何类型的对象发送到成功流,而不仅仅是文本。

  • 因此,严格来说,echo -n 'hi'例如,Bash 的 等价物仅'hi'在 PowerShell 中 - 字符串被隐式发送到成功流。

  • 也就是说,将没有尾随换行符的字符串发送到控制台的唯一方法是绕过成功流Write-Host -NoNewLine,正如安迪的回答中所讨论的,这就是

    • 在 PowerShell v4 之前,Write-Host根本无法捕获输出,因为它只是直接打印到控制台,完全绕过了 PowerShell 的输出流。

    • 由于PowerShell的V5,Write-Host写入一个新引入的流写入结构化信息,数量6,并且实际上是一个别名
      Write-Information -InformationAction Continue-见Get-Help Write-Information

  • 写入文件时,PowerShell v5-NoNewline以下 cmdlet添加了对参数的支持(直到 v4,写入/附加到文本文件总是会附加一个尾随换行符),但请注意,-NoNewLine也不会输入之间放置换行符, 是否应该有多个:

    • Set-Content / Add-Content
    • Out-File

将多个命令的输出写入输出流中的单行字符串的解决方法:

解决方法是简单地使用字符串插值或串联或格式来组合所有命令的输出,这些命令应该形成一行输出文本:

例如,以下 Bash 代码的(粗略)等价物......

#!/bin/bash

echo -n 'Today is: '
date
Run Code Online (Sandbox Code Playgroud)

...在 PowerShell 中是:

所有这些 PowerShell 命令都会向成功流发送一个单行字符串,但请注意,当它在控制台中打印时,此字符串本身总是后跟一个换行符。


Mik*_*sen 5

你可以使用Write-Host:

Write-Host "Hello " -nonewline
Write-Host "There!"
Run Code Online (Sandbox Code Playgroud)

或者从命令行:

PS C:\> Write-Host "Hello " -nonewline ; Write-Host "There!"
Hello There!
Run Code Online (Sandbox Code Playgroud)