2013-04-03 6 views
2

Я пытаюсь получить информацию о логическом диске с удаленных компьютеров, используя пользовательские настройки Daniele get-wmiobject function из-за моей потребности в параметре таймаута.Как преобразовать объект ManagementObjectCollection в формат, читаемый Powershell?

Функция работает отлично, но я также хочу сохранить $ results в переменной и прокрутить ее, чтобы найти диски, свободное пространство которых упало ниже определенного порога.

Вот моя часть кода. Я добавил параметр $ where к функции Даниэля, которая будет привязана к запросу. Его функция в остальном то же самое.

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") 
     } 
    } 
} 

Когда я запускаю этот скрипт из командной строки, он дает эту ошибку:

The '=' operator failed: Invalid Class.

Я понимаю, что это может быть из-за $ результаты возвращаются здесь является объектом ManagementObjectCollection .Net. Поэтому я попытался преобразовать это в строку, присоединив метод ToString() к методу Get(). Это остановило ошибку, но метод ToString() просто возвращает имя класса, к которому принадлежит объект, а не фактические данные. Я также попробовал Get(). GetEnumerator(). ToString() с аналогичным результатом.

Как мне преобразовать результаты в формат, читаемый Powershell?

+1

Рассматривали ли вы обновление до V3 и использования CIM вместо WMI? – mjolinor

+0

Извините, но ваш скрипт работает отлично для меня. в какой строке вы встречаете ошибку. – JPBlanc

+0

@JPBlanc Какую версию Powershell вы используете? – deutschZuid

ответ

0

синтаксис может быть:

$SearchKBsResult | select <property you want> | foreach {$_.property you want} 
Смежные вопросы