powershell脚本输出到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

这在使用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

试试这个。。。请注意,它是附加到文件的,因此如果您运行两次,将有两次运行的数据

$((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