2014-12-26 3 views
1

У меня есть следующий скрипт, который будет собирать статистику использования диска с удаленных серверов. Я пытаюсь получить вывод для отображения имени хоста, а не IP из файла. \ ServerIPs.txt, который читает скрипт. Я попытался извлечь «SystemName» из get-wmiobject Win32_LogicalDisk, но не смог получить имя для отображения. Что нужно добавить, чтобы имя хоста отображалось в отчете, а не IP-адрес хоста?Отчет об использовании диска Powershell

$erroractionpreference = "SilentlyContinue" 
$a = New-Object -comobject Excel.Application 
$a.visible = $True 

$b = $a.Workbooks.Add() 
$c = $b.Worksheets.Item(1) 

$c.Cells.Item(1,1) = "Server Name" 
$c.Cells.Item(1,2) = "Drive" 
$c.Cells.Item(1,3) = "Total Size (GB)" 
$c.Cells.Item(1,4) = "Free Space (GB)" 
$c.Cells.Item(1,5) = "Free Space (%)" 

$d = $c.UsedRange 
$d.Interior.ColorIndex = 19 
$d.Font.ColorIndex = 11 
$d.Font.Bold = $True 

$intRow = 2 

$colComputers = get-content ".\ServerIPs.txt" 
foreach ($strComputer in $colComputers) 
{ 
    $colDisks = get-wmiobject Win32_LogicalDisk -computername $strComputer -Filter "DriveType = 3" 
    foreach ($objdisk in $colDisks) 
    { 
    $c.Cells.Item($intRow, 1) = $strComputer.ToUpper() 
    $c.Cells.Item($intRow, 2) = $objDisk.DeviceID 
    $c.Cells.Item($intRow, 3) = "{0:N0}" -f ($objDisk.Size/1GB) 
    $c.Cells.Item($intRow, 4) = "{0:N0}" -f ($objDisk.FreeSpace/1GB) 
    $c.Cells.Item($intRow, 5) = "{0:P0}" -f ([double]$objDisk.FreeSpace/[double]$objDisk.Size) 
    $intRow = $intRow + 1 
    } 
} 
+1

Что вы пытались получить имя, полученное для отображения? Я не вижу '$ objDisk.SystemName' в любом месте. Вы можете попробовать добавить' -Property DeviceID, SystemName, Size, FreeSpace' в ваш вызов 'Get-WmiObject'. –

+0

вы можете сделать' [System. Net.Dns] :: GetHostByAddress ("xxxx") ', чтобы получить имя хоста из ваших DNS, если по какой-то причине wmi не работает для вас – Paul

+0

Либо/оба этих комментария могут быть ответы – Matt

ответ

1

Спасибо за помощь @BaconBits. Я также добавил столбец даты к выходу.

$erroractionpreference = "SilentlyContinue" 
$a = New-Object -comobject Excel.Application 
$a.visible = $True 

$b = $a.Workbooks.Add() 
$c = $b.Worksheets.Item(1) 

$c.Cells.Item(1,1) = "Server Name" 
$c.Cells.Item(1,2) = "Drive" 
$c.Cells.Item(1,3) = "Total Size (GB)" 
$c.Cells.Item(1,4) = "Free Space (GB)" 
$c.Cells.Item(1,5) = "Free Space (%)" 
$c.Cells.Item(1,6) = "Date" 

$d = $c.UsedRange 
$d.Interior.ColorIndex = 19 
$d.Font.ColorIndex = 11 
$d.Font.Bold = $True 

$intRow = 2 

$colComputers = get-content ".\ServerIPs.txt" 
foreach ($strComputer in $colComputers) 
{ 
    $colDisks = get-wmiobject Win32_LogicalDisk -computername $strComputer -Filter "DriveType = 3" 
    foreach ($objdisk in $colDisks) 
    { 
    $c.Cells.Item($intRow, 1) = $objDisk.SystemName 
    $c.Cells.Item($intRow, 2) = $objDisk.DeviceID 
    $c.Cells.Item($intRow, 3) = "{0:N0}" -f ($objDisk.Size/1GB) 
    $c.Cells.Item($intRow, 4) = "{0:N0}" -f ($objDisk.FreeSpace/1GB) 
    $c.Cells.Item($intRow, 5) = "{0:P0}" -f ([double]$objDisk.FreeSpace/[double]$objDisk.Size) 
    $c.Cells.Item($intRow, 6) = Get-Date 
    $intRow = $intRow + 1 
    } 
} 
0

Потому что многие люди могли бы использовать код, приведенный в других ответах, это также может быть стоит уравнивать, что правильно и полностью закрыть Excel, также необходимо освободить COM-ссылки. В моем собственном тестировании было обнаружено, что удаление переменной для Excel также гарантирует отсутствие оставшихся ссылок, которые будут держать Excel.exe открытым (например, если вы отлаживаете ISE).

Без выполнения вышеуказанного, если вы посмотрите в диспетчере задач, вы можете увидеть, что Excel все еще работает ... в некоторых случаях много копий.

Это связанно с тем, как объект COM упаковываются в «во время выполнения вызываемой обертки»

Вот скелет код, который должен быть использован:.

$excel = New-Object -ComObject Excel.Application 
$excel.Visible = $true 
$workbook = $excel.Workbooks.Add() 
# or $workbook = $excel.Workbooks.Open($xlsxPath) 

# do work with Excel... 

$workbook.SaveAs($xlsxPath) 
$excel.Quit() 
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) 
# no $ needed on variable name in Remove-Variable call 
Remove-Variable excel 
Смежные вопросы