2015-06-15 5 views
-1

Я написал небольшой скрипт, чтобы получить некоторую базовую информацию с нескольких удаленных серверов. Но мой результат немного странный. Я считаю, что моя проблема связана с моей функцией $DRIVE.Loop Issue - Remote Server

Код:

$serversList = 'svr01.xxx.com', 
       'svr03.xxx.com', 
       'svr05.xxx.com', 
       'svr06.xxx.com', 
       'svr08.xxx.com' 
       #End of Server List 

Write-Output "Start of Hal0 `n"; 

ForEach ($server in $serversList) { 
    $OS = (Get-WmiObject -class Win32_OperatingSystem).Caption 
    $SYSNAME = (Get-WmiObject -class Win32_LogicalDisk -ComputerName $server).SystemName 
    $DRIVE = { 
     Get-WmiObject -Class Win32_LogicalDisk -ComputerName $server | 
      Where-Object {$_.DriveType -eq 3} | 
      Select-Object DeviceID, Description,` 
       @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, ` 
       @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}} | 
      FT -AutoSize 
    } 
    $server + ' | ' + $SYSNAME + ' | ' + $OS + ' | ' 
} 

Write-Output "`n End of Hal0"; 

Результаты:

Start of Hal0 

svr01.xxx.com | SVR01 SVR01 SVR01 SVR01 | Mic 
rosoft Windows 8.1 Enterprise | 
svr03.xxx.com | SVR03 SVR03 SVR03 SVR03 | Mic 
rosoft Windows 8.1 Enterprise | 
svr05.xxx.com | SVR05 SVR05 SVR05 SVR05 | Mic 
rosoft Windows 8.1 Enterprise | 
svr06.xxx.com | SVR06 SVR06 SVR06 SVR06 | Mic 
rosoft Windows 8.1 Enterprise | 
svr08.xxx.com | SVR08 SVR08 SVR08 SVR08 | Mic 
rosoft Windows 8.1 Enterprise | 

End of Hal0 

То, что я надеялся, что мой результат будет чистой системы Полное имя, система Краткое название, OS, Hard Drive Free/Используемое пространство для каждого из 5 серверов.

svr08.xxx.com | svr08 | Windows 8 | C: 1111 MB Free/500 MB Used, E: 11 MB Free/10 MB Used. 

ответ

2

вы никогда выход $DRIVE где-нибудь, а выражение для $DRIVE не должно быть в ScriptBlock в первую очередь. Имя компьютера повторяется несколько раз, потому что вы получаете свойство SystemName для каждого объекта логического диска. Кроме того, $OS получает имя ОС для локального компьютера, а не удаленного компьютера.

Изменить код на что-то вроде этого:

$serversList | ForEach-Object { 
    $os = Get-WmiObject -Class Win32_OperatingSystem -Computer $_ 
    $disks = Get-WmiObject -Class Win32_LogicalDisk -Computer $_ | 
      Where-Object {$_.DriveType -eq 3} | 
      ForEach-Object { 
       '{0} {1:D} MB Free/{2:D} MB Used' -f $_.DeviceID, 
        [int]($_.FreeSpace/1GB), [int]($_.Size/1GB) 
      } 

    New-Object -Type PSCustomObject -Property @{ 
     'FQDN'   = $_ 
     'ServerName'  = $os.PSComputerName 
     'OperatingSystem' = $os.Caption 
     'Disks'   = $disks -join ', ' 
    } 
} | Export-Csv 'C:\output.csv' -Delimiter '|' -NoType 

Если вы хотите, чтобы вывод вторит вместо записывается в файл использования ConvertTo-Csv вместо Export-Csv.


Добавление: Если вы хотите импортировать выходной файл в использование базы данных запятые как разделителей полей для CSV и присоединиться к информации о диске с какой-либо другой символ:

$serversList | ForEach-Object { 
    ... 
    New-Object -Type PSCustomObject -Property @{ 
     'FQDN'   = $_ 
     'ServerName'  = $os.PSComputerName 
     'OperatingSystem' = $os.Caption 
     'Disks'   = $disks -join '|' 
    } 
} | Export-Csv 'C:\output.csv' -NoType 
+0

Спасибо очень много для вашего ответа! Он работает прямо сейчас, но он производит нечетный вывод. http://imgur.com/QoNWp5G – TheAce

+0

@TheAce Если вы хотите открыть файлы с расширением .csv в Excel, то файлы * должны * использовать ',' в качестве разделителя. Измените расширение на что-то другое (например, .txt), и вы можете указать, какие символы являются разделителями при открытии файла в Excel. –

+0

Спасибо @Ansgar Я открыл его в блокноте, и он выглядит намного лучше. Теперь мой вопрос заключается в том, как я могу нажать эту новую информацию «Имя_сервера» | «FQDN» | «Диски» | «Операционная система» на таблицу SQL? – TheAce