Powershell尝试在循环中捕获

Powershell尝试在循环中捕获,powershell,Powershell,我正在尝试获取ESX服务器场中windows 7计算机的所有C:\驱动器使用情况的报告。我的初始ps代码将把所有windows 7计算机提取到下面的csv文件示例图片中。理想情况下,我希望首先使用DNS名称查询磁盘空间,如果由于RPC错误而失败,它应该捕获错误并使用IP地址再次运行该命令。这是因为在某些情况下,dns条目没有在我们的dns上注册,并且在某些情况下,ESX在查询过程中会看到169.x.x.x IP,然后会首先通过dns名称进行轮询 这里的问题是,我无法用catch命令捕获RPC失败

我正在尝试获取ESX服务器场中windows 7计算机的所有C:\驱动器使用情况的报告。我的初始ps代码将把所有windows 7计算机提取到下面的csv文件示例图片中。理想情况下,我希望首先使用DNS名称查询磁盘空间,如果由于RPC错误而失败,它应该捕获错误并使用IP地址再次运行该命令。这是因为在某些情况下,dns条目没有在我们的dns上注册,并且在某些情况下,ESX在查询过程中会看到169.x.x.x IP,然后会首先通过dns名称进行轮询

这里的问题是,我无法用catch命令捕获RPC失败。在下面的示例中,我特意用虚拟dns名称填充.csv文件,希望它能够捕获错误并在捕获部分执行命令。不幸的是,它似乎不起作用

这里有人能在这上面遮光吗


对Get-WmiObject cmdlet而不是Select Object使用ErrorAction

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)}}
}
请改用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

您的-Erroraction-Stop cmdlet位于错误的位置。您必须使用Get-WmiObject cmdlet才能使其正常工作。WMI在最好的一天非常缓慢且不可靠。如果您希望快速获得准确的数据,并能够使用PowerCLI访问vSphere,那么这就是解决方法。获取此错误。。它不会以某种方式通过catch命令移动。获取WMIOObject:RPC服务器不可用。第7行的HRESULT:0x800706BA异常字符:13+获取WmiObject-类win32\u卷-计算机名“$”。IPAdd…+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:InvalidOperation::[Get WMIOObject],COMException+FullyQualifiedErrorId:GetWMIComeException,Microsoft.PowerShell.Commands.GetWmiObjectCommandHi Brendan。这个解决方案似乎可行,但我得到了一些奇怪的结果。主机名和Ip显示了一长串的所有内容,而所有服务器的磁盘空间都是相同的。。已在此处上载输出:。介意检查一下吗?您在pastebin上的输出不见了,但听起来您的变量$vm可能有多个all?虚拟机对象。因此,您需要另一个围绕$vm对象的foreach。我会修改我的答案,让你明白我的意思。谢谢你,布伦丹。它工作得很好。不过,还有一点,我有没有办法过滤掉C:\drive和IPv4地址,就像在VI控制台中显示的地址一样,通常只以10.x.x.x.x或172.x.x.x.x开头。是的,如果您在$vm.guest.Disks上添加where子句,比如{$\路径-eq'C:\},并且可能为IP添加-notmatch:。看看你是否能解决这些问题,如果你被难住了,请回来询问具体情况。
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