每个数学问题的Powershell。总和是累积的,而不是轮询的每个服务器

每个数学问题的Powershell。总和是累积的,而不是轮询的每个服务器,powershell,Powershell,正在尝试对DHCP使用情况编写每日“检查”脚本。使用netsh从DHCP服务器提取信息,查看正在使用和可用的IP地址,删除字母和分隔字符,所以我只剩下地址的原始数量。然后将它们相加以获得总地址池大小,并以%结束。我已经花了几天时间研究这个问题,终于得到了我喜欢的东西,但是我的数学不太好。一些远程站点有多个作用域/子网,当尝试将这些数字添加到每台服务器的总数中时,它只是累积添加地址。我想我的问题是$u和$f中的最后一个“foreach”,但我不确定如何修复它并得到我想要的。如果我删除了最后一个fo

正在尝试对DHCP使用情况编写每日“检查”脚本。使用netsh从DHCP服务器提取信息,查看正在使用和可用的IP地址,删除字母和分隔字符,所以我只剩下地址的原始数量。然后将它们相加以获得总地址池大小,并以%结束。我已经花了几天时间研究这个问题,终于得到了我喜欢的东西,但是我的数学不太好。一些远程站点有多个作用域/子网,当尝试将这些数字添加到每台服务器的总数中时,它只是累积添加地址。我想我的问题是$u和$f中的最后一个“foreach”,但我不确定如何修复它并得到我想要的。如果我删除了最后一个foreach,它可以很好地用于单子网站点,但不能在任何一台服务器上处理更多的内容。我希望这是有道理的

function dhcp {
  $servers = "contoso","contoso2","contoso3"
  Foreach ($server in $servers)
  {
    netsh dhcp server \\$server show server
    "DHCP Server: $server"
    #netsh dhcp server \\$server show mibinfo | select-string -pattern "scope", "subnet", "No. of Addresses in use = ", "No. of free Addresses = "
    $u = (netsh dhcp server \\$server show mibinfo | 
         where-object {$_-match "No. of Addresses in use = "}  | 
         foreach-object{$_.Split(“=")[-1].Trim( ).Trim(".").Trim(" ")} | 
         foreach-object{($u2+=[int]$_)})
    $f = (netsh dhcp server \\$server show mibinfo | 
         where-object {$_-match "No. of free Addresses = "} | 
         foreach-object{$_.Split(“=")[-1].Trim().Trim(".").Trim(" ")} | 
         foreach-object{($f2+=[int]$_)})
    $total2 = ([int]$u2+[int]$f2)
    $percent = [Math]::Round([int]$u2/[int]$total2*100,2)
    "No. of Addresses in use = $u2"
    "No. of free Addresses = $f2"
    "Total Addresses: $total2" 
    "Percent in use: $percent%"
    "                ======"
    "=================================================="
  } 
}
dhcp | out-file "C:\Users\crabbypatty\Desktop\Powershell\dhcplog $(get-date -f MM-dd-HHmm).txt"

这可能和在第一个循环的顶部将变量设置为零一样简单吗?意思是在“netsh dhcp server\$server show server”之后,将u2和f2都设置回零

Foreach ($server in $servers) {
    netsh dhcp server \\$server show server
    "DHCP Server: $server"
此时,重置变量:

    $f2 = 0
    $u2 = 0

通过在正则表达式中使用捕获组,并使用切换条件处理正则表达式的能力,我可以大大简化这一过程

哦,我会使用字典来确保每个服务器都被单独跟踪,同时允许您在捕获完成后访问数据。如果您保存数据,这也将使您能够进行一些历史跟踪和比较。。。但这超出了这个范围;)

e、 g

$addressesInUse=@{};
$addressesFree=@{};
foreach($serverList中的服务器){
$mibinfo=netsh dhcp server\\$server show mibinfo;#| where object{$\匹配“正在使用的地址数=”}|
foreach($mibinfo中的信息){
开关-正则表达式($info){
“正在使用的地址数=(?\d+)”{
$val=$Matches[“count”];
if($AddressUse.ContainsKey($server)){
$addressesiuse.Add($server,$val);
}否则{
$scopeCount.$server+=$val;
}
打破
}
“可用地址数=(?\d+)”{
$val=[int]:解析($Matches[“count”]);
if($addressfree.ContainsKey($server)){
$addressesFree.Add($server,$val);
}否则{
$addressesFree.$server+=$val;
}
打破
}
}
}
}
foreach($key in$addressesFree.key){
$total=$addressesuse.$key+$addressesFree.$key;
$percent=[Math]::舍入($addressesiuse.$server/$total*100,2)
写入主机(“服务器{0}的DHCP可用性”-f$key);
写入主机(“正在使用的地址数={0}”-f$addressesInUse.$key);
写主机(“可用地址的数量={0}”-f$addressesFree.$key);
写入主机(“总地址:{0}”-f$Total);
写入主机(“正在使用的百分比:{0}%”-$Percent);
}

我不理解输入格式,但这可能像在第一个循环的顶部将变量设置为零那样简单吗?意思是在“netsh dhcp server\\$server show server”之后,将u2和f2都设置回零?就是这样!!哦,天哪,我真是个蠢货……从来没有想过静态地给它们赋值0。明亮的谢谢你,巨怪!!!输入的只是dhcp服务器dns名称的列表,这些名称已被更改以保护无辜者。很高兴提供帮助。我将转载作为实际答案。感谢您的反馈。:-)
    $addressesInUse = @{};
    $addressesFree = @{};

    foreach ($server in $serverList) {
        $mibinfo = netsh dhcp server \\$server show mibinfo; #| where-object {$_-match "No. of Addresses in use = "}  |
        foreach ($info in $mibinfo) {
            switch -regex ($info) {
                "No. of Addresses in use = (?<count>\d+)" {
                    $val = $Matches["count"]; 
                    if ($addressesInUse.ContainsKey($server)) {
                        $addressesInUse.Add($server,$val);
                    } else {
                        $scopeCount.$server += $val;
                    }
                    break;
                }
                "No. of free Addresses = (?<count>\d+)" {
                    $val = [int]::Parse($Matches["count"]);
                    if ($addressesFree.ContainsKey($server)) {
                        $addressesFree.Add($server,$val);
                    } else {
                        $addressesFree.$server += $val;
                    }
                    break
                }
            }
        }
    }

    foreach ($key in $addressesFree.keys) {
        $total = $addressesInUse.$key + $addressesFree.$key;
        $percent = [Math]::Round($addressesInUse.$server / $total*100,2)
        Write-Host ("DHCP availablility for server {0}" -f $key);
        Write-Host ("No. of Addresses in use = {0}" -f $addressesInUse.$key);
        Write-Host ("No. of free Addresses = {0}" -f $addressesFree.$key);
        Write-Host ("Total Addresses: {0}" -f $total);
        Write-Host ("Percent in use: {0}%" - $percent);
    }