我正在编写一个脚本来监控我的事件日志。此命令仅收集“错误”和“警告”消息并将它们放入 $entries 数组中。
$entries = $log.Entries |
? {$_.TimeWritten -gt ($(Get-Date).AddDays(-2)) -and `
(($_.EntryType -like "Error") -or `
($_.EntryType -like "Warning"))} |
Format-Table -wrap
如果我在控制台中输出 $entries,它会显示我想要的内容 - 日志条目 - 但是如果我将其通过管道输出到文本文件 (Add-Content $output $entries),我只会得到 .NET 类名 (System.Diagnostics.EventLogEntry)。我也尝试过 foreach ($entry in $entries),结果类似。
我在这里缺少什么基本的 PowerShell 原理?
答案1
基本上 - add-content/set-content 命令只是对您传递给它的任何内容执行 ToString()。对于许多 .NET 对象来说,这只是类名。
如果你这样做:
out-string -inputobject $entries | add-content "yourfile.txt"
这应该正确转换为字符串并将其输出到您的文本文件。
答案2
添加内容会给你这种行为,如果你想要的是字段而不是对象描述,那么最简单的方法就是使用传统的文件重定向,例如
$entries > $output
或者
$entries >> $output
如果你想追加。这对你的示例代码来说正如我所期望的那样,而你的示例
Add-Content $output $entries
仅为我输出对象类型描述(例如 Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData )。
答案3
管道通过:| Add-Content $output
当管道传输的内容包含多行时,似乎不能很好地工作。
例如:
$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 文件已正确创建,包括开头的注释。但是,Get-ItemProperty 输出显示为中文字符。