2017-09-26 72 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 –