我正在为 Get-Winevent 构建一个包装脚本,以便使用多个搜索条件并行搜索多台计算机的事件日志。
我正在为 Get-Winevent 构建一个 XML 过滤器,然后调用这个相当简单的工作流程:
WorkFlow Get-ParallelEvent {
Param(
[string[]]$Computers,
[string]$FilterXml
)
#Query computers
ForEach -Parallel ($Computer in $Computers) {
If (Test-Connection $Computer -Count 1 -ErrorAction SilentlyContinue) {
Get-WinEvent -ComputerName $Computer -FilterXml $FilterXml -ErrorAction SilentlyContinue
}
}
}
但是当我运行脚本时,出现错误:
找不到名为“ComputerName”的参数。此命令中的远程连接由“PSComputerName”参数处理。
但是,我不想依赖 PSRemoting(并非所有服务器都启用该功能),而 Get-Winevent 确实支持查询远程系统而无需借助 PSRemoting。
经过多次尝试和错误,我添加了一个仅进行一次迭代的虚拟 ForEach 循环,使用了一个不影响执行的变量。它按预期工作 - 不需要 PSRemoting(我可以使用 -ComputerName 而不是 -PSComputerName):
WorkFlow Get-ParallelEvent {
Param(
[string[]]$Computers,
[string]$FilterXml
)
#Query computers
@('dummy') | ForEach {
ForEach -Parallel ($Computer in $Computers) {
If (Test-Connection $Computer -Count 1 -ErrorAction SilentlyContinue) {
Get-WinEvent -ComputerName $Computer -FilterXml $FilterXml -ErrorAction SilentlyContinue
}
}
}
}
这不会造成任何开销,所以我可以接受这个修复。但是,我很好奇为什么 Get-Winevent 需要在原始工作流中使用 PSRemoting,以及为什么通过在 ForEach 循环中嵌套相同的代码来改变这种情况。
谢谢。