Powershell Plus或减号比较运算符(模糊逻辑)?

时间:2019-01-24 20:21:04

标签: windows powershell vmware

所以让我告诉你我在这里想做什么。我们的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
}

无论出于何种原因,这都不起作用。我需要类似的东西。有什么想法吗?

更新:原来是用户错误,我在测试命令时尝试使用错误的数字。我以为这是语法,那是我自己使用的数字。

1 个答案:

答案 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
}