所以让我告诉你我在这里想做什么。我们的SolarWinds警报报告Windows读取的磁盘容量,而不是虚拟机虚拟磁盘大小设置。我要尝试的是匹配大小,以便我可以找到正确的虚拟磁盘并报告其数据存储的可用空间,以确定我们是否可以添加更多虚拟磁盘。
这是问题所在,Windows和VMWare之间的GB编号永远不匹配。假设磁盘具有Windows报告的149.67容量,那么VMWare设置为150或150.18854,或类似的值。我无法在不知道确切数目的情况下找到虚拟磁盘,但是从理论上讲,如果我能说一个比较运算符具有一定的呼吸空间,例如正负1甚至0.5,我就可以找到它。例如:
Get-HardDisk -Vm SERVERNAME | Where-Object {
$_.CapacityGB -lt $size + 0.5 -and
$_.CapacityGB -gt $size - 0.5
}
无论出于何种原因,这都不起作用。我需要类似的东西。有什么想法吗?
更新:原来是用户错误,我在测试命令时尝试使用错误的数字。我以为这是语法,那是我自己使用的数字。
答案 0 :(得分:0)
因此,因为我设法回答了自己的问题,所以我想在这里发布实现此目的的脚本。请注意,您将需要一个带有逗号分隔的服务器名和容量的txt文件。如果需要,您可能会修改它,以通过VMWare数据收集执行许多其他操作。最后,您需要知道哪些列是哪些,并以逗号分隔将其导入Excel。
大多数变量是十进制值。
还请注意,我还没有找到一种以编程方式处理多个匹配磁盘的发现的方法。
$serverlist = Get-Content "./ServerList.txt"
$logfile = "./Stores.txt"
remove-item "./Stores.txt"
Function LogWrite {
Param (
[string]$srv,
[string]$disk,
[string]$store
)
Add-Content $logfile -value $srv","$disk","$store
}
foreach ($item in $serverlist){
$store = "Blank"
$disk = "Blank"
try {
$server,$arg = $item.split(',')
$round = [math]::Round($arg,0)
$disk = get-harddisk -vm $server | where-object{$_.CapacityGB -lt ($round + 2) -and $_.CapacityGB -gt ($round - 2) }
if ([string]::IsNullOrEmpty($disk)){
$disk = "Problem locating disk."
$store = "N/A"
continue
}
if ($disk.count -gt 1) {
$disk = "More than one matching disk."
$store = "N/A"
} else {
$store = get-harddisk -vm $server | where-object{$_.CapacityGB -lt ($round + 2) -and $_.CapacityGB -gt ($round - 2) } | Get-Datastore | %{ "{0},{1},{2}" -f $_.Name,[math]::Round($_.FreeSpaceGB,1),[math]::Round($_.CapacityGB,1) }
}
}
catch {
$disk = "Physical"
$store = "N/A"
}
LogWrite $server $disk $store
}