避免使用echo中的换行符

时间:2012-02-14 16:34:51

标签: powershell

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

4 个答案:

答案 0 :(得分:36)

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

Write-Host "Hi" -NoNewLine

请记住,这与echo | Write-Output不同。

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对象发送到管道中的下一个对象。

答案 1 :(得分:5)

您可以使用Write-Host

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

或者从命令行:

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

答案 2 :(得分: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也不会添加换行符< em>在输入之间,应该有多个:

    • 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命令都会向成功流发送一个单行字符串,但请注意,当该字符串本身在控制台中打印时,后面总是会跟一个换行符。

答案 3 :(得分:1)

Write-Host -n 

在PowerShell 5中适合我。