我想拉我们的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部分中执行命令。不幸的是,它似乎没有工作。
这里的任何人都可以遮挡这一个灯光?
$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
你'-Er roraction Stop' cmdlet在错误的地方。你必须把它放在'Get-WmiObject' cmdlet中才能使用。 –
WMI在最好的一天痛苦地缓慢而不可靠。如果您想要快速准确的数据并使用PowerCLI访问vSphere,那么这就是要走的路。 – brendan62269