有人能解释一下这种行为吗?出了什么问题?
PS C:\Scripts\Customer_Shares_Permissions> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.17763.5328
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.17763.5328
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
PS C:\Scripts\Customer_Shares_Permissions> Get-Content .\test.ps1
# Test Write-Host redirecting
Write-Host "Dies ist eine Ausgabe"
Write-Host "Per Write-Host"
Write-Host "auf die Konsole"
Write-Host "Bitte prüfe den redirect in eine Datei"
PS C:\Scripts\Customer_Shares_Permissions> .\test.ps1
Dies ist eine Ausgabe
Per Write-Host
auf die Konsole
Bitte prüfe den redirect in eine Datei
PS C:\Scripts\Customer_Shares_Permissions> .\test.ps1 > test.txt
Dies ist eine Ausgabe
Per Write-Host
auf die Konsole
Bitte prüfe den redirect in eine Datei
PS C:\Scripts\Customer_Shares_Permissions> Get-Content .\test.txt
PS C:\Scripts\Customer_Shares_Permissions>
文件test.txt
已创建,但是为空,并且输出仍然显示在控制台上,而不是直接进入文件。
这不是我所期望的行为。我的想法哪里出了问题?
答案1
您应该使用它Write-Output
,因为Write-Host
它不会写入文件而是写入控制台。
Write-Output "First line" > text.txt
Write-Output "Second line" >> text.txt
用于>>
将新内容附加到文件。
答案2
这个问题很基本——它来自于对什么缺乏理解Write-Host
做:
从 Windows PowerShell 5.0 开始,
Write-Host
是的包装器Write-Information
。这允许您使用Write-Host
将输出发送到信息流。
Write-Information
使用信息流。现在我们来看看流文档:
6 | 信息流 | PowerShell 5.0 |
Write-Information
我们可以看到这6
就是发生动作的流号。
这意味着要重定向Write-Host
到文件,您需要使用:
.\test.ps1 6>test.txt
在 PS 5.0 之前,如果有人仍在使用这样的过时版本(7 已经推出一段时间了),则重定向是不可能的。
但是正如另一个答案所述,除非您有特定的用途Write-Host
,否则您可以直接使用它Write-Output
来写入标准输出流 (success, stream number 1
)。或者您甚至可以使用隐式输出,即字符串,PowerShell 将其视为标准输出。