PowerShell文本输出与控制台输出

我正在构build一个脚本来监视我的事件日志。 此命令仅收集“错误”和“警告”消息,并将它们放入$ entries数组中。

$entries = $log.Entries | ? {$_.TimeWritten -gt ($(Get-Date).AddDays(-2)) -and ` (($_.EntryType -like "Error") -or ` ($_.EntryType -like "Warning"))} | Format-Table -wrap 

如果我在控制台中输出$条目,它会显示我想要的 – 日志条目 – 但是如果我把它输出到一个文本文件(Add-Content $ output $ entries),我只能得到.NET类名(System.Diagnostics .EventLogEntry)。 我也尝试了foreach($条目在$条目)具有类似的结果。

什么是我在这里失踪的基本PowerShell原则?

基本上 – add-content / set-content命令只是在你传递给它的任何东西上做一个ToString()。 对于许多.NET对象,这只是类名。

如果你这样做:
out-string -inputobject $ entries | 添加内容“yourfile.txt”

这应该正确地转换为一个string,并将其输出到您的文本文件。

添加内容会给你这种行为,如果你想要的字段而不是对象描述,那么最简单的方法是只使用传统的文件redirect

 $entries > $output 

要么

 $entries >> $output 

如果你想追加。 这工作正如我期望它为您的示例代码,而你的例子

 Add-Content $output $entries 

只为我输出对象types描述(例如Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData)。

通过pipe道:| 添加内容$输出

当pipe道内容中包含许多行时,不会显示出效果。

例如:

 $output = "C:\temp\test.txt" $TimeStamp = Get-Date; "STARTED: " + $TimeStamp | Out-File $output -width 800 Get-ItemProperty -path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\" | Add-Content $output 

在上面的例子中,test.txt文件得到了正确的创build,包括开始的注释。 但是,Get-ItemProperty输出显示为中文字符。