PowerShell 文本输出与控制台输出

PowerShell 文本输出与控制台输出

我正在编写一个脚本来监控我的事件日志。此命令仅收集“错误”和“警告”消息并将它们放入 $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 输出显示为中文字符。

相关内容