2016-06-16 2 views
0

У меня есть сценарий, который проверяет соединение с списком серверов и, если он доступен для контакта, получает статус службы и помещает результаты в три переменные: $Computer, $Ping (True/False), и $Service (Запуск или останов).try-catch в обход этапа

Вывод находится в хеш-таблице, но я могу только показать серверы, к которым подключаются ARE, а не те, которые не могут быть подключены.

я поставил try/catch в $Ping блоке, а также -ErrorAction Stop, так что он не пытается запустить $Service сценарий, и вместо того, чтобы перейти к следующему $Computer в массиве. Я думаю, что я пытаюсь сделать две вещи сразу, что конфликтуют друг с другом:

  1. добавить переменные в @Splat и
  2. не обрабатывают дальше.

Есть на самом деле гораздо больше запросов удаленного реестра в моем сценарии, которые будут иметь никакого значения, если $Computer не может быть соприкасаться, но я сократили его на этот пост.

Function Get-Ping { 
    $Servers = (gc "c:\temp\test.txt") 
    foreach ($Computer in $Servers) { 
     Write-Host 
     Write-Host "---------------------------------" 
     Write-Host "QUERYING $Computer" 
     Write-Host 
     Write-Host "Performing ping test..." 
     try { 
      $Ping = Test-Connection $Computer -Count 1 -ErrorAction Stop 
     } catch { 
      Write-Warning "Cannot Ping $Computer" 
      Write-Host "Trying next computer..." 
      Write-Host 
      continue 
     } 
     if ($Ping) {$Ping="$True"} 
     Write-Host $Computer "can be pinged" 

     $svcRRStopped = $false 
     if ($Computer -ne $env:COMPUTERNAME) { 
      Write-Host "Check RemoteRegistry status..." 
     } 
     $svcRR = Get-Service -ComputerName $Computer -Include RemoteRegistry 

     $SelectSplat = @{ 
      Property = (
       'Computer', 
       'Ping', 
       'Service' 
     )} 

     New-Object -TypeName PSObject -Property @{ 
       Computer=$Computer 
       Ping=$Ping 
       Service=$svcRR.status 
     } | Select-Object @SelectSplat 
    } 
} 

$results = Get-Ping 
$tableFragment = $results | Select 'Computer','Ping','Service' 
$tableFragment 

ответ

0

Не делайте вещи более сложными, чем они должны быть.

function Get-Ping { 
    Get-Content 'C:\temp\test.txt' | ForEach-Object { 
    $isAvailable = [bool](Test-Connection $_ -Count 1 -EA SilentlyContinue) 
    if ($isAvailable) { 
     $rreg = Get-Service -Computer $_ -Name RemoteRegistry | 
       Select-Object -Expand Status 
    } else { 
     $rreg = 'n/a' 
    } 
    New-Object -Type PSObject -Property @{ 
     Computer = $_ 
     Ping  = $isAvailable 
     Service = $rreg 
    } 
    } 
} 

Get-Ping 
+0

Спасибо. Тем не менее, он возвращает последний элемент в текстовом файле 6 раз (один раз для каждого элемента в списке), – JDGEEK

+0

Не забывайте также, что будет еще много запросов к каждому компьютеру в списке, который следует игнорировать если PING недоступен, но он ДОЛЖЕН добавить значение в PSObject, а не полностью игнорировать его из результатов. – JDGEEK

+0

@JDGEEK Я забыл изменить переменную цикла на '$ _' при изменении цикла с' foreach' на ' ForEach-Object'. Исправлена. –

0

Вы можете просто использовать -QUIET параметр:

Test-Connection $_ -Count 1 -Quiet 
Смежные вопросы