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-Output
将string
对象发送到管道中的下一个对象.
Write-Host
:http://technet.microsoft.com/en-us/library/dd347596.aspxWrite-Output
:http://technet.microsoft.com/en-us/library/dd315282.aspx在 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 中是:
使用可扩展的字符串(字符串插值,内部"..."
,使用子表达式运算符$(...)
):
"Today is: $(Get-Date)"
Run Code Online (Sandbox Code Playgroud)或者,使用字符串连接,带操作符+
:
'Today is: ' + (Get-Date)
Run Code Online (Sandbox Code Playgroud)或者,使用-f
(字符串)格式运算符:
'Today is: {0}' -f (Get-Date)
Run Code Online (Sandbox Code Playgroud)所有这些 PowerShell 命令都会向成功流发送一个单行字符串,但请注意,当它在控制台中打印时,此字符串本身总是后跟一个换行符。
你可以使用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)