这在使用Powershell的Windows 10上完美运行,但在Win Server 2012 R2上严重失败。 我已经尝试过使用重定向和-outfile进行多种形式的操作,但最终只能以空文件或损坏的脚本结尾。
任何人都可以帮我将下面的一根衬纸发送到Win Server 2012 R2上的txt文件中,我只是没收到
$((Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor") | foreach-object { write-host "$($_.Name) : $($_.PercentProcessorTime)"}) *>&1 > output.txt
答案 0 :(得分:1)
Write-Host
写入主机,该主机在控制台窗口中是该窗口的 display (屏幕),< em>绕过 PowerShell的(成功)输出流,后者是管道运算符(|
)和重定向运算符>
的作用。
仅在PowerShell v5 + 中,Write-Host
写入信息输出流 (流号6
-请参见about_Redirection帮助主题;默认情况下,该输出仍会到达 host ),因此 可以重定向-通过{ {1}}或通过6>
-因此,将所有流重定向到成功输出流(*>
)的包罗万象的重定向*>&1
用于将1
重定向到成功输出流,但在早期PowerShell版本中不是-和 PowerShell版本 4 <附带的Windows Server 2012 R2 / strong>。
但是,在您的情况下没有充分的理由使用Write-Host
开始:要么使用Write-Output
-cmdlet,其目的是写入成功输出流(Write-Host
)-或最好使用PowerShell的隐式输出功能,其中未捕获到变量中,通过管道或重定向的任何输出(返回值)为隐式写入成功输出流:
1
请注意,命令中没有# Note how the use of "$($_.Name) : $($_.PercentProcessorTime)"
# *by itself* implicitly causes it to be *output* (written to the pipeline).
Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor" |
Foreach-Object { "$($_.Name) : $($_.PercentProcessorTime)" } > output.txt
(subexpression operator),这不是必需的。
如果列之间的特定间距不重要,则可以编写得更简单(由于仅选择了2个属性,因此应用了隐式Format-Table
格式):
$(...)
注意:在PowerShell v3(于2012年9月发布)中,CIM cmdlet(例如,Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor" |
Select-Object Name, PercentProcessorTime > output.txt
)取代了WMI cmdlet(例如,Get-CimInstance
)。因此,应避免使用WMI cmdlet ,这尤其重要,因为将来所有努力都将在PowerShell [Core](版本6及更高版本)上执行,甚至没有 不再。有关更多信息,请参见this answer。
答案 1 :(得分:0)
尝试此操作...请注意,该文件将追加到文件中,因此,如果运行两次,则将获得两次运行的数据
$((Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor") | foreach-object { "$($_.Name) : $($_.PercentProcessorTime)" >> output.txt})
OP接受了这个作为答案,但这不一定是最好的解决方案。有关详细说明和其他解决方案,我建议使用a different answer submitted for this question.