我正在构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输出显示为中文字符。