提问人:Kenny 提问时间:2/9/2016 最后编辑:Ansgar WiechersKenny 更新时间:2/10/2016 访问量:998
哈希表过滤器/选择
hashtable filter / select
问:
我今晚正在重写一个现有的服务器健康检查脚本,以将其值存储在哈希表中,这部分工作正常。但是,我希望结果转到 CSV 文件,并且该文件仅填充我已将其标记为需要操作的服务器。目前,它们正在生成事件 ID 7011,或者 ping 测试失败。Test-Connection
代码如下:
$CheckServer = @{}
$Servers = (Get-Content $Dir\Test.txt)
foreach ($Server in $Servers) {
$CheckServer.EventID7011 = Get-Eventlog -LogName System -ComputerName $Server -Newest 1 |
Where-Object {$_.EventId -eq 7011} | select Message
if ($CheckServer.EventID -ne $Null) {
$CheckServer.Server = "$Server"
$CheckServer.ActionReq = "Yes"
}
$CheckServer.Ping = Test-Connection -ComputerName $Server -Count 1 -Quiet
if (! $CheckServer.Ping) {
$CheckServer.Server = "$Server"
$CheckServer.ActionReq ="Yes"
$CheckServer.Ping = "Offline"
} else {
$CheckServer.Server = "$Server"
$CheckServer.ActionReq = "No"
$CheckServer.Ping = "Online"
}
New-Object -TypeName PSObject -Property $CheckServer |
Export-Csv "ScanResults.csv" -NoTypeInformation -Append
}
最后我需要正确的代码,就目前而言,该脚本适用于收集/存储哈希表数组中的数据,但我只想选择那些需要操作的服务器。因此,如果我扫描 100 台服务器,其中 2 台处于 ping 失败状态,我只需要选择并发送到 .$CheckServer
Export-Csv
答:
0赞
Martin Brandl
2/9/2016
#1
您需要先将对象存储到列表中,然后才能对其进行筛选和导出。请参阅代码中带有注释的行:
$CheckServer = @{}
$serverObjects = @() # create a list of server objects
$Servers = (get-content $Dir\Test.txt)
ForEach ($Server in $Servers) {
$CheckServer.EventID7011 = get-eventlog -LogName System -ComputerName
$Server -newest 1 | where-object {$_.eventID -eq 7011} |select message
If ($CheckServer.EventID -ne $Null) {
$CheckServer.Server="$Server"
$CheckServer.ActionReq = "Yes"}
$CheckServer.Ping = Test-Connection -ComputerName $Server -count 1 -quiet
if (! $CheckServer.Ping) {
$CheckServer.Server="$Server"
$CheckServer.ActionReq ="Yes"
$CheckServer.Ping= "Offline"}
Else {
$CheckServer.Server="$Server"
$CheckServer.ActionReq ="No"
$CheckServer.Ping= "Online"}
# Add the server object to the list
$serverObjects += New-Object -TypeName PSObject -Property $CheckServer
}
}
# now filter it:
$serverObjects | where ActionReq -eq "Yes" | Export-Csv -Path "...."
1赞
Ansgar Wiechers
2/9/2016
#2
如果您只想在输出中不响应的服务器,那么只在服务器列表中使用过滤器会简单得多:Test-Connection
Where-Object
Get-Content "$Dir\Test.txt" |
Where-Object { -not (Test-Connection -Computer $_ -Count 1 -Quiet) } |
Select-Object @{n='Server';e={$_}}, @{n='ActionReq';e={'Yes'}},
@{n='Ping';e={'Offline'}} |
Export-Csv 'ScanResults.csv' -NoType -Append
评论
Where-Object
Export-Csv