2017-09-26 73 views
0

我想拉我們的ESX場中的Windows 7機器的所有C:\驅動器使用情況的報告。我的初始ps代碼將提取所有Windows 7機器nto csv文件(下面的示例圖片)。我希望理想情況下首先使用DNS名稱查詢磁盤空間,如果由於RPC錯誤而導致磁盤空間失敗,則應該捕獲錯誤並使用IP地址重新運行該命令。這是因爲有些情況下,DNS條目未在我們的DNS上註冊,並且有時候ESX在查詢期間看到169.x.x.x IP,然後它將首先通過DNS名稱進行輪詢。Powershell嘗試並抓住一個循環

問題在於,我無法使用catch命令捕獲RPC失敗。在下面的示例中,我有意使用虛擬DNS名稱填充了.csv文件,希望它能夠捕獲錯誤並在catch部分中執行命令。不幸的是,它似乎沒有工作。

這裏的任何人都可以遮擋這一個燈光?

CSV File Sample

csv file

$Win7JumpboxList = import-csv 'D:\Win7DiskSpace\Win7PoweredOn.csv' | 
ForEach-Object { 
    try { 
     Get-WmiObject -Class win32_volume -ComputerName $_.DnsName -Filter "drivetype=3 and DRIVELETTER = 'C:' " | Select-Object @{LABEL='Computer';EXPRESSION={$_.pscomputername}}, DriveLetter, @{LABEL="Capacity (GB)";e={[math]::round($_.Capacity/1GB, 2)}}, @{LABEL="FreeSpace (GB)";e={[math]::round($_.FreeSpace/1GB, 2)}},@{LABEL="FreeSpace (%)";e={[int]($_.Freespace*100/$_.Capacity)}} -ErrorAction Stop 
    } 
    catch [System.Runtime.InteropServices.COMException] { 
     Get-WmiObject -Class win32_volume -ComputerName $_.IPAddress -Filter "drivetype=3 and DRIVELETTER = 'C:' " | Select-Object @{LABEL='Computer';EXPRESSION={$_.pscomputername}}, DriveLetter, @{LABEL="Capacity (GB)";e={[math]::round($_.Capacity/1GB, 2)}}, @{LABEL="FreeSpace (GB)";e={[math]::round($_.FreeSpace/1GB, 2)}},@{LABEL="FreeSpace (%)";e={[int]($_.Freespace*100/$_.Capacity)}} 
    } 
} 

$Win7JumpboxList | Export-Csv D:\Win7DiskSpace\Win7DiskSpace.csv -NoTypeInformation -force 
+0

你'-Er roraction Stop' cmdlet在錯誤的地方。你必須把它放在'Get-WmiObject' cmdlet中才能使用。 –

+0

WMI在最好的一天痛苦地緩慢而不可靠。如果您想要快速準確的數據並使用PowerCLI訪問vSphere,那麼這就是要走的路。 – brendan62269

回答

0

使用的PowerCLI改爲:

C:> $vms = get-vm 
C:> foreach ($vm in $vms) { 
C:> foreach ($vmdisk in $vm.guest.Disks) { 
>> $vm | select Name, 
>>  @{n='hostname';e={$vm.guest.hostname}}, 
>>  @{n='IPAddress';e={$vm.guest.IPAddress}}, 
>>  @{n='Disk';e={$vmdisk.Path}}, 
>>  @{n='CapacityGB';e={$vmdisk.CapacityGB}}, 
>>  @{n='FreeSpaceGB';e={$vmdisk.FreeSpaceGB}} 
>> } 
>> } 


Name  : somevm 
hostname : somevm.mydomain.org 
IPAddress : {192.168.130.141, 6c9e::9n5b:cbdb:6ce5:fb72} 
Disk  : C:\ 
CapacityGB : 98.533199310302734375 
FreeSpaceGB : 57.00951385498046875 

Name  : anothervm 
hostname : anothervm.mydomain.org 
IPAddress : {192.168.130.142, 6c9e::9n5b:cbdb:6ce5:fb73} 
Disk  : C:\ 
CapacityGB : 98.533199310302734375 
FreeSpaceGB : 54.06373657644533 
+0

嗨Brendan。解決方案似乎正在工作,但我得到了一些奇怪的輸出。主機名和IP顯示所有內容的長列表,而所有服務器的磁盤空間相同。在此處上傳輸出:https://pastebin.com/raw/DeYp3yAeM。注意檢查一下嗎? –

+0

你在pastebin上的輸出消失了,但它聽起來像你的變量'$ vm'可能有多個(所有?)VM對象。所以你需要在'$ vm'對象周圍有另一個'foreach'。我會編輯我的答案,讓你知道我的意思。 – brendan62269

+0

謝謝布倫丹。它完美的作品。還有一點點,有沒有什麼辦法可以過濾出C:\驅動器,以及IPv4控制檯中顯示的IPv4地址(通常以10.x.x.x.x或172.x.x.x開頭)。 –

1

使用ErrorAction爲GET-WmiObject可以cmdlet的替代選擇,對象

try { 
    Get-WmiObject -Class win32_volume -ComputerName $_.DnsName -Filter "drivetype=3 and DRIVELETTER = 'C:' " -ErrorAction Stop | Select-Object @{LABEL='Computer';EXPRESSION={$_.pscomputername}}, DriveLetter, @{LABEL="Capacity (GB)";e={[math]::round($_.Capacity/1GB, 2)}}, @{LABEL="FreeSpace (GB)";e={[math]::round($_.FreeSpace/1GB, 2)}},@{LABEL="FreeSpace (%)";e={[int]($_.Freespace*100/$_.Capacity)}} 
} 
catch [System.Runtime.InteropServices.COMException] { 
    Get-WmiObject -Class win32_volume -ComputerName $_.IPAddress -Filter "drivetype=3 and DRIVELETTER = 'C:' " | Select-Object @{LABEL='Computer';EXPRESSION={$_.pscomputername}}, DriveLetter, @{LABEL="Capacity (GB)";e={[math]::round($_.Capacity/1GB, 2)}}, @{LABEL="FreeSpace (GB)";e={[math]::round($_.FreeSpace/1GB, 2)}},@{LABEL="FreeSpace (%)";e={[int]($_.Freespace*100/$_.Capacity)}} 
} 
+0

我同意。 Upvote –

+0

獲取此錯誤。它不會以某種方式移動catch命令。 Get-WmiObject:RPC服務器不可用。 (異常來自HRESULT:0x800706BA) 在行:7 char:13 + Get-WmiObject -Class win32_volume -ComputerName'$ _。IPAdd ... + ~~~~~~~~~~~~~~~ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 +分類信息:InvalidOperation:(: )[Get-WmiObject],COMException + FullyQualifiedErrorId:GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand –