Hashtable фильтр / выберите
Сегодня вечером я работал над переписыванием существующего сценария проверки работоспособности сервера, чтобы сохранить его значения в хеш-таблице, и эта часть работает нормально. Однако я хочу, чтобы результаты помещались в файл CSV, и этот файл заполнялся только серверами, на которых я отметил их как требующие действий. В настоящее время они генерируют событие с кодом 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
}
Мне нужен правильный код в конце, так как он стоит, скрипт отлично работает для сбора / хранения данных в массиве хеш-таблиц $CheckServer
, но я бы хотел выбрать только те серверы, которые требуют действий. Итак, если я сканирую 100 серверов, и 2 из них находятся в состоянии сбоя проверки связи, я хочу, чтобы только те были выбраны и отправлены на Export-Csv
,
2 ответа
Вам необходимо сохранить объекты в списке, прежде чем вы сможете фильтровать и экспортировать их. Смотрите строки с комментариями в вашем коде:
$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 "...."
Если вы хотите только серверы, которые не отвечают на 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