我正在为Get-Winevent构build一个包装脚本,以使用多个search条件并行地search多台计算机的事件日志。
我正在为Get-Winevent构造一个XMLfilter,然后调用这个相当简单的工作stream程:
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循环只用一个迭代,使用不影响执行的variables。 这符合预期 – 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需要在原始工作stream程中使用PSRemoting,以及为什么通过在ForEach循环中嵌套相同的代码来进行更改。
谢谢。