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