powershell脚本输出到txt文件
这在使用powershell的Windows 10上运行良好,但在Win Server 2012 R2上严重失败。 我尝试过许多使用重定向和-outfile的表单,但充其量只能得到一个空文件或断开的脚本 有人能帮我把下面的一行代码发送到win server 2012 R2上的txt文件吗?我就是不明白powershell脚本输出到txt文件,powershell,Powershell,这在使用powershell的Windows 10上运行良好,但在Win Server 2012 R2上严重失败。 我尝试过许多使用重定向和-outfile的表单,但充其量只能得到一个空文件或断开的脚本 有人能帮我把下面的一行代码发送到win server 2012 R2上的txt文件吗?我就是不明白 $((Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfO
$((Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor") | foreach-object { write-host "$($_.Name) : $($_.PercentProcessorTime)"}) *>&1 > output.txt
试试这个。。。请注意,它是附加到文件的,因此如果您运行两次,将有两次运行的数据
$((Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor") | foreach-object { "$($_.Name) : $($_.PercentProcessorTime)" >> output.txt})
编辑 OP接受了这个答案,但这不一定是最好的解决方案。为了获得全面的解释和另一种解决方案,我建议,顾名思义,写入主机,主机在控制台窗口中是该窗口的显示(屏幕),绕过PowerShell的(成功)输出流,后者是管道操作符(
|
)重定向操作符
将在上运行
仅在PowerShell v5+中,写入主机
写入信息输出流(流编号6
-请参阅帮助主题;默认情况下,该输出仍会发送到主机)因此,可以通过6>
或*>
重定向,因此,将所有流重定向到成功输出流(1
)的全面重定向*>&1
)确实可以用于将写入主机
重定向到成功输出流,但不在早期的PowerShell版本中—以及PowerShell版本4附带的Windows Server 2012 R2
但是,在您的情况下,没有很好的理由使用写入主机
来开始:或者使用-其目的是写入成功输出流(1
)的cmdlet,或者最好使用PowerShell的隐式输出功能,其中任何输出(返回值)都没有捕获到变量中,管道或重定向隐式写入成功输出流:
# 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
请注意,命令中没有$(…)
,这是不需要的
如果列之间的特定间距不重要,则可以更简单地编写(因为只选择了两个属性,所以会应用隐式格式):
注意:CIM cmdlet(例如,
获取CimInstance
)取代了PowerShell v3(2012年9月发布)中的WMI cmdlet(例如,获取WmiObject
)。因此,应该避免使用WMI cmdlet,,这不仅仅是因为未来所有工作都要用到的PowerShell[Core](版本6及更高版本)甚至不再有它们了。有关更多信息,请参见。:CIM cmdlet(例如,获取CimInstance
)取代了PowerShell v3(2012年9月发布)中的WMI cmdlet(例如,获取WmiObject
)。因此,应该避免使用WMI cmdlet,尤其是因为PowerShell[Core](版本6及更高版本)(将来所有的工作都将在这里进行)甚至不再具有它们。有关更多信息,请参阅。乔纳森:《代码》是一种消遣;只需使用
;$(…)
是不必要的(虽然它存在于OP中,但不值得重用,除非指出冗余)。最重要的是:它正在从使用Write Host
切换到字符串的隐式输出,并切换到使您的解决方案工作的成功输出流(在版本5之前的PS版本中)。在回答中解释这一方面对于将来的读者很有帮助。@mklement0我使用单个
操作符进行了测试,但它会在每次Foreach对象
循环中覆盖文件,因此最终输出只有一行。我倾向于不评论潜在的风格编码,比如使用$(…)
,这是因为你把>
放在foreach对象
脚本块中-把它放在后面(例如,1..10 | foreach对象{“[$”}>foo.txt
)-这也更有效。@mklement0所有优点。谢谢你的邀请feedback@Idaho_Huskey我会接受mklement0的回答。它更具解释性,代码实际上更高效。
Get-WmiObject -Query "select Name, PercentProcessorTime from Win32_PerfFormattedData_PerfOS_Processor" |
Select-Object Name, PercentProcessorTime > output.txt