【问题标题】:Avoid newline in echo避免回声中的换行符
【发布时间】:2012-03-06 00:57:02
【问题描述】:

目前在 PowerShell 中,echo 命令总是附加一个换行符。 Unix echo -n 的等价物是什么?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    echoWrite-Output 的别名,它将对象发送到管道中的下一个命令。如果您只想在控制台上显示文本,您可以这样做:

    Write-Host "Hi" -NoNewLine

    请记住,这与 echo|Write-Output 不是同一个 cmdlet。

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

    这是一个例子:

    Write-Host "hi" | Get-Member
    

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

    Write-Output "hi" | Get-Member
    

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

    【讨论】:

      【解决方案2】:

      你可以使用Write-Host:

      Write-Host "Hello " -nonewline
      Write-Host "There!"
      

      或者从命令行:

      PS C:\> Write-Host "Hello " -nonewline ; Write-Host "There!"
      Hello There!
      

      【讨论】:

        【解决方案3】:

        补充Andy Arismendi's helpful answer

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

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

        • 因此,严格来说,相当于 Bash 的 echo -n 'hi',例如,在 PowerShell 中只是 'hi' - 字符串隐式发送到成功流。

        • 也就是说,控制台发送没有尾随换行符的字符串的唯一方法是绕过成功流,这就是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
        

        ...在 PowerShell 中是:

        • 使用expandable string(字符串插值,在"..."内,使用子表达式运算符$(...)):

          "Today is: $(Get-Date)"
          
        • 或者,使用 字符串连接,使用运算符 +:

          'Today is: ' + (Get-Date)
          
        • 或者,使用-f,(字符串-)format operator

          'Today is: {0}' -f (Get-Date)
          

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

        【讨论】:

        • @TomaszGandor 我对答案进行了一些重构,首先将字符串插值(可扩展字符串)放在首位,并且我还添加了 -f 的使用作为替代方案。
        【解决方案4】:
        Write-Host -n 
        

        在 PowerShell 5 中为我工作。

        【讨论】:

        • PowerShell 的弹性语法允许您仅使用参数名称的前缀,只要该前缀在所有参数中是唯一的即可。在您的情况下,write-host -n 只是 write-host -NoNewLine 的缩写,如其他答案中所述。使用-n 很好,但您应该知道,如果引入另一个以n 开头的参数名称,它可能会在一天中中断。这也是您应该始终在 scripts 中使用完整参数名称的原因。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        相关资源
        最近更新 更多