目前在PowerShell中,echo
命令始终附加换行符。什么是Unix echo -n
的等价物?
答案 0 :(得分:36)
echo
是Write-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-Output
将string
对象发送到管道中的下一个对象。
答案 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中适合我。