3

DHCP の使用状況を毎日「チェック」するスクリプトを作成しようとしています。netshを使用してDHCPサーバーから情報を取得し、使用中および使用可能なIPアドレスを調べ、文字と区切り文字を削除して、アドレスの生の数だけを残しました。次に、それらを合計してアドレス プールの合計サイズを取得し、% in use で終了します。私は数日間これに夢中になっていて、最終的に気に入ったものを手に入れましたが、私の数学はうまくいきません. 一部のリモート サイトには複数のスコープ/サブネットがあり、それらの数をサーバーごとの合計に追加しようとすると、代わりにアドレスが累積的に追加されます。私の問題は $u と $f の最後の「foreach」だと思いますが、それを修正して必要なものを取得する方法がわかりません。最後の foreach を削除すると、単一のサブネット サイトでは正常に機能しますが、1 つのサーバーでそれ以上処理することはできません。それが理にかなっていることを願っています。

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"
4

2 に答える 2

1

正規表現でキャプチャ グループを使用し、正規表現を処理するスイッチ条件の機能も使用することで、これを大幅に簡素化できます。

ああ、ディクショナリを使用して、キャプチャが完了した後にデータにアクセスできるようにしながら、各サーバーが個別に追跡されるようにします。これにより、データを保存した場合、履歴の追跡と比較を行うこともできます...しかし、それはこの範囲外です;)

例えば

    $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);
    }
于 2013-03-20T12:13:54.947 に答える
0

これは、最初のループの先頭で変数をゼロに設定するのと同じくらい簡単でしょうか?「netshdhcpserver\ $ server show server」の直後の意味で、u2とf2の両方をゼロに戻しますか?

Foreach ($server in $servers) {
    netsh dhcp server \\$server show server
    "DHCP Server: $server"

この時点で、変数をリセットします。

    $f2 = 0
    $u2 = 0
于 2012-12-12T22:35:45.250 に答える