2013-04-03 3 views
2

Daniele의 사용자 지정 get-wmiobject function을 사용하여 원격 컴퓨터에서 논리 디스크 정보를 검색하려고하는데 시간 초과 매개 변수가 필요합니다.ManagementObjectCollection 객체를 Powershell에서 읽을 수있는 형식으로 변환하는 방법은 무엇입니까?

이 함수는 완벽하게 작동하지만 $ 결과를 변수에 저장하고 루프를 통해 빈 공간이 특정 임계 값 아래로 떨어지는 드라이브를 찾고 싶습니다.

여기 내 코드 부분입니다. Daniele의 함수에 $ where 매개 변수를 추가하여 쿼리에 첨부했습니다. 그의 기능은 다른 점이 다릅니다. 때문에 $ 결과가 여기에 반환 된 ManagementObjectCollection 닷넷 객체입니다되기

The '=' operator failed: Invalid Class.

나는이 될 수 있음을 이해 : 나는 명령 행에서이 스크립트를 실행하면

Function get-wmicustom([string]$computername,[string]$namespace,[string]$class,[int]$timeout=15,[string]$where) 
{ 
    $ConnectionOptions = new-object System.Management.ConnectionOptions 
    $EnumerationOptions = new-object System.Management.EnumerationOptions 

    $timeoutseconds = new-timespan -seconds $timeout 
    $EnumerationOptions.set_timeout($timeoutseconds) 

    $assembledpath = "\\" + $computername + "\" + $namespace 
    write-host $assembledpath -foregroundcolor green 

    $Scope = new-object System.Management.ManagementScope $assembledpath, $ConnectionOptions 
    $Scope.Connect() 

    $querystring = "SELECT * FROM " + $class + " " + $where 
    write-host $querystring 

    $query = new-object System.Management.ObjectQuery $querystring 
    $searcher = new-object System.Management.ManagementObjectSearcher 
    $searcher.set_options($EnumerationOptions) 
    $searcher.Query = $querystring 
    $searcher.Scope = $Scope 

    trap { $_ } $result = $searcher.Get() 

    return $result 
} 

$servers = get-content -Path "c:\ServerMonitoring\servers.txt" 
$threshold = 5 

foreach($server in $servers) 
{ 
    write-host "Checking server $server..." 

    #$drive_information = get-wmiobject -ComputerName $server -query "select Name, FreeSpace from Win32_logicaldisk where MediaType = 12" 
    $drive_information = get-wmicustom -ComputerName $server -NameSpace "root\cimv2" -Class Win32_logicaldisk -TimeOut 3 -Where "WHERE MediaType = 12" 

    write-host "Drive information collected from $server..." 

    foreach($drive in $drive_information) 
    { 
     $drive_freespace_gb = [Math]::Round($drive.FreeSpace/1024/1024/1024, 2) 
     $drive_name = $drive.Name 

     write-host "Checking drive $drive_name" 

     if ($drive_freespace_gb -le $threshold -and $drive_name -notlike "*T:*") 
     { 
      write-host "Drive $drive_name on $server has only $drive_freespace_gb GB left." 
      $wait = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") 
     } 
    } 
} 

은,이 오류를 제공합니다. 그래서 ToString() 메서드를 Get() 메서드에 연결하여이 문자열을 문자열로 변환하려고 시도했습니다. 이로 인해 오류가 중지되었지만 ToString() 메서드는 실제 데이터가 아니라 객체가 속한 클래스의 이름을 반환합니다. 나는 Get(). GetEnumerator(). ToString()도 비슷한 결과로 시도했다.

Powershell에서 읽을 수있는 형식으로 결과를 변환하려면 어떻게해야합니까?

+1

는 V3로 업그레이드 대신 WMI의 CIM을 사용하여 고려 적이 있습니까? – mjolinor

+0

미안하지만, 당신의 scrip이 나를 위해 잘 달린다. 어떤 라인에서 당신을 만날까요? – JPBlanc

+0

@JPBlanc 어떤 Powershell 버전을 사용합니까? – deutschZuid

답변

0

구문은 다음과 같습니다

$SearchKBsResult | select <property you want> | foreach {$_.property you want}