2016-06-16 63 views
0

我有一个脚本来测试连接到服务器列表,如果可以联系,获取服务的状态,并将结果放入三个变量中,$Computer,$Ping(True/False),和$Service(正在运行或已停止)。try-catch跳过一个步骤

输出是散列表,但我只能显示可联系的服务器,而不是无法联系的服务器。

我已经把一个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