首先,我的PS知识是非常基础的,所以要提前知道。
我正在编写一个基本的脚本来搜索存档的.evtx文件中的EventID并清除“reports”。Where-Object查询位于.txt文件中,存储在.\AuditEvents\文件夹中。我正在尝试对.txt文件执行ForEach,并将每个查询传递给Get-WinEvent。
下面是查询在.txt文件中的显示方式示例:{($_.ID -eq "11")}
该脚本为:
$ae = Get-ChildItem .\AuditEvents\
ForEach ($f in $ae) {
$qs = Get-Content -Path .\AuditEvents\$f
Get-WinEvent -Path .\AuditReview\*.evtx -MaxEvents 500 | Select-Object TimeCreated, ID, LogName, MachineName, ProviderName, LevelDisplayName, Message | Where-Object $qs | Out-GridView -Title $f.Name
}
这是错误:
Where-Object : Cannot bind argument to parameter 'FilterScript' because it is null.
At C:\Users\######\Desktop\PSAuditReduction\PSAuditReduction.ps1:6 char:177
+ ... e, ProviderName, LevelDisplayName, Message | Where-Object $qs | Out-G ...
+ ~~~
+ CategoryInfo : InvalidData: (:) [Where-Object], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.WhereObjectCommand
1条答案
按热度按时间zz2j4svz1#
您的症状暗示
$qs
是$null
,这反过来又暗示文件.\AuditEvents\$f
是空的。但是,即使它有内容,也不能将结果 * string * 原样传递给
Where-Object
的-FilterScript
参数(位置隐含),script block需要一个script block({ ... }
)。必须使用
[scriptblock]::Create()
显式地从字符串创建脚本块。一个简单的例子:
注:
.\AuditEvents\$f
文件只包含 * 一 * 行,并且该行包含适合使用Where-Object
筛选器的有效PowerShell源代码。退一步说:
正如Abraham Zinala所指出的,过滤事件日志条目的一种更快的方法是使用
Get-WinEvent
的-FilterHashtable
参数。这允许您在查询文件中保存hastable常量,您可以使用
Import-PowerShellDataFile
将其直接读入哈希表: