2016-12-21 5 views
9

테스트-연결이 간헐적으로 자원 오류의 부족으로 실패 자원 부족으로 실패 당신이 목록을 테스트 할 때파워 쉘 테스트 - 연결 인해

test-connection : Testing connection to computer 'SOMESERVER' failed: Error due to lack of resources 
At line:1 char:45 
+ ... ($server in $ServersNonProd.Name) { test-connection $server -Count 1} 
+           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ResourceUnavailable: (SOMESERVER:String) [Test-Connection], PingException 
    + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand 

결과, 그것은 안정적이고 상당히 쓸모가 아니다 컴퓨터가 루프에 있습니다. 이 기능을 안정적으로 사용하기위한 수정 프로그램, 대안 또는 해결 방법이 있습니까?

이것은 현재 해결책이지만 아직 충분히 안정적이지 않습니다 (때때로 그들은 5 회 연속 실패합니다). 모든 지연과 재 시도 때문에 영원히 걸립니다.

$Servers = Import-CSV -Path C:\Temp\Servers.csv 

$result = foreach ($Name in $Servers.FQDN) { 
    $IP = $null 
    if (Resolve-DNSName $Name -ErrorAction SilentlyContinue) { 
     $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 100 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 200 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 300 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
     if ($IP -eq $null) { 
      Start-Sleep -Milliseconds 400 
      $IP = (Test-Connection -Count 1 -ComputerName $Name -ErrorAction SilentlyContinue).IPv4Address 
     } 
    } 
    new-object psobject -Property @{FQDN = $Name; "IP Address" = $IP} 
} 

정상적인 핑 (PING.EXE는)마다 작동하므로 좋은 방법이 있다면 PowerShell로 (최대 호스트 또는 아래로, 어떤 IP가 응답) 있다는 분석에 이상적인 솔루션처럼 보인다,하지만 할 나는 그저 효과가있는 것을 필요로하므로, 나는 아이디어에 열심입니다.

+0

음, 꽤 이상하게 보입니다. 주위를 돌아 다니려면 do-while 루프를 구현할 수 있지만 근본 원인을 해결하는 것이 좋습니다. 너는 그걸 고치려고 한 것처럼? '/ sfc scannow' 적어도? 아무것도?PS5로 업그레이드 하시겠습니까? – 4c74356b41

+1

iirc 재부팅이 일반적으로이를 수정하지만 (실제로 잘못되었을 수 있으며, 1 년이 넘었습니다) 실제로 PS 버전을 실행하고 있습니까? PSv2에만 영향을 미치는 이슈를 기억하는 것 같습니다 (다시 말하지만, 잘못 리 시트 될 수 있습니다) –

+1

'-Quiet' 또는'-ErrorAction SilentlyContinue' 또는 둘 다를 사용하는 것은 어떻습니까? 이것은 원격 호스트에서 'WMI' 오류로 인해 발생할 수 있습니다. 그리고 '-Count 1'은 항상 신뢰할 만하지는 않습니다. 내 평범한 줄 :'(Test-Connection $ host -Quiet -Count 2 -EA 0) {# ...}'은 매력처럼 작동합니다. – sodawillow

답변

6

최신 버전의 PowerShell에서 Test-Connection-Quiet 매개 변수는 항상 True 또는 False 중 하나를 반환하는 것으로 보입니다. 그러나, 내가 네트워크가 단순히 사용할 수 없습니다 최근에 때를 테스트하지 않았습니다

$Ping = Test-Connection -ComputerName $ComputerName -Count 1 -Quiet 

: 이전 버전에서 지속적으로 작동하지 못했지만, 지금은 다른 일을하고 있어요 하나 또는 그들은 그것을 개선했습니다 .


이전 답 : DNS는 주소 또는 때 네트워크를 사용할 수없는 응답하지 않는 경우

Test-Connection

잘 응답하지 않습니다. 즉, cmdlet에서 핑을 보낼 수 없다고 판단하면 트랩하거나 무시하기 어려운 불쾌한 방법으로 오류가 발생합니다. Test-Connection은 DNS가 이름을 주소로 확인하고 네트워크가 항상 존재 함을 보장 할 수있는 경우에만 유용합니다.

$Ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$ComputerName' AND Timeout=1000"; 

또는 CIM 핑 :

나는 WMI 핑을 사용하는 경향이

$Ping2 = Get-CimInstance -ClassName Win32_PingStatus -Filter "Address='$ComputerName' AND Timeout=1000"; 

둘 중 하나 기본적으로 동일하지만 것들에 대한 약간 다른 형식을 반환합니다. @BenH 설명

$StatusCodes = @{ 
    [uint32]0  = 'Success'; 
    [uint32]11001 = 'Buffer Too Small'; 
    [uint32]11002 = 'Destination Net Unreachable'; 
    [uint32]11003 = 'Destination Host Unreachable'; 
    [uint32]11004 = 'Destination Protocol Unreachable'; 
    [uint32]11005 = 'Destination Port Unreachable'; 
    [uint32]11006 = 'No Resources'; 
    [uint32]11007 = 'Bad Option'; 
    [uint32]11008 = 'Hardware Error'; 
    [uint32]11009 = 'Packet Too Big'; 
    [uint32]11010 = 'Request Timed Out'; 
    [uint32]11011 = 'Bad Request'; 
    [uint32]11012 = 'Bad Route'; 
    [uint32]11013 = 'TimeToLive Expired Transit'; 
    [uint32]11014 = 'TimeToLive Expired Reassembly'; 
    [uint32]11015 = 'Parameter Problem'; 
    [uint32]11016 = 'Source Quench'; 
    [uint32]11017 = 'Option Too Big'; 
    [uint32]11018 = 'Bad Destination'; 
    [uint32]11032 = 'Negotiating IPSEC'; 
    [uint32]11050 = 'General Failure' 
    }; 
$StatusCodes[$Ping.StatusCode]; 
$StatusCodes[$Ping2.StatusCode]; 

또는, 내가 사용한 적이 닷넷 핑처럼, 너무, 당신을 위해 그 많은 작업을 수행한다 : 여기에 가장 큰 단점은 상태 코드를 직접 해결해야한다는 것입니다. WMI와 CIM에 찬성하여 그 사용을 중단 한 이유가 있었지만 더 이상 그 이유가 무엇인지 기억할 수 없습니다.

+0

.NET ping이 자세한 오류를 반환하지 않기 때문에 가능성이 있습니다. 대부분의 성공 또는 TimedOut 인 것처럼 보입니다. 다른 오류 코드가 반환되는지 확인하기 위해 비정상적인 네트워크를 테스트하지는 않았습니다. – dragon788

+0

@ dragon788 그렇습니다. 대부분의 네트워크 상태는 쉽게 재현하기가 어렵습니다. –

8

난 당신이 TTL/분열을 설정해야하는 경우 Send 메서드가 추가 매개 변수를 취할 수있는 .Net Ping class 오히려

$Timeout = 100 
$Ping = New-Object System.Net.NetworkInformation.Ping 
$Response = $Ping.Send($Name,$Timeout) 
$Response.Status 

Test-Connection보다는 참고를 사용하는 부분입니다. 또한 타임 아웃은 밀리 세컨드이며, $ name은 5 초라고 생각됩니다. 일반적으로 너무 길기 때문입니다.