2017-02-08 8 views
0

CIDR表記で指定されたIPv6の範囲をPowershellの範囲(first_address-last_address)に変換しようとしていますが、ちょっと戻ってきます。Powershellの最初のアドレスと最後のアドレスにIPv6 CIDRを解析する

ソースデータのサンプル:必要な出力の

2a01:111:f406:c00::/64 
2a01:111:f400:7c00::/54 
2a01:111:f403::/48 

サンプルは、(iフォーマットを台無しにすることができ、正確である必要はありません。

2a01:111:f406:c00::-2a01:111:f406:c00:ffff:ffff:ffff:ffff 
2a01:111:f400:7c00::-2a01:111:f400:7fff:ffff:ffff:ffff:ffff 
2a01:111:f403:0:0:0:0:0::-2a01:111:f403:ffff:ffff:ffff:ffff:ffff 

私は広範囲にGoogleで検索しましたが、 PowerShellの正しい方向に私を指摘している何も見つかりませんでした - 私はPHPとJSの例を見つけましたが、うまく翻訳しませんでした。

すべてのポインタ?

ありがとうございます!

+0

私は「正規化」CIDRの形式を使用して、固定フォーマットを有するように与えられたから始まるお勧めします - 「抑制解除」先行ゼロ、およびそのゼロを記入::の代わりに。 (例: '2a01:111:f406:c00 ::/64'は' 2a01:0111:f406:0c00:0000:0000:0000:0000/64'に変換されます)あなたの目的を達成する方法を簡単に理解することができます。 –

+0

追加のヒント: '-split'と' -f'演算子が便利かもしれません。 –

+0

@JeffZeitlinありがとうございます、それは実現可能な解決策ですが、私はどのようなエッジケースについても正確さを心配しています(リストに100+以上あります) –

答えて

3

私の知る限りでは、IPv6ネットワークセグメントを解析BCLは何もありません - 私はIPNetwork library(IPv4の両方で動作し、6)使用します。

Add-Type -Path C:\path\to\System.Net.IPNetwork.dll 

# Parse ipv6/cidr string 
$Network = [System.Net.IPNetwork]::Parse('2a01:111:f400:7c00::/54') 

# Format string with first and last usable address 
$Range = '{0}-{1}' -f $Network.FirstUsable,$Network.LastUsable 
+0

ありがとう、それは私が探していることを行う、理想的には私は移植性の理由のために外部ライブラリを使用しないようにしたいが、それはかなりスムーズに動作します。 –

+0

誰かのためのメモ、私はこれを続行するまで、DLLをロードできませんでした:http://stackoverflow.com/questions/2094694/how-can-i-run-powershell-with-the-net-4-runtime –

+0

インターネットからダウンロードしたファイルからゾーン広告を削除するには、 'Unblock-File'を使用してください –

0

私はこれで終わった、$ ipv6cidrが配列でありますCIDR形式でのIPv6アドレスの...

#convert IPv6 CIDR to IPv6 range 
[email protected]() 
foreach($ip in $ipv6cidr){ 
[email protected]() 
$netbits=$ip.Split("/")[1] 
$ip = $ip.Split("/")[0] 
$ip=$ip -replace '::','' 
$ip=$ip.Split(':') 
foreach($p in $ip){ 
$p='0x'+$p 
$bin=[Convert]::ToString($p, 2).PadLeft(16,'0') 
$binip+=$bin 
} 
$binip=$binip -join '' 
If($binip.Length -lt $netbitslength) 
{ 
$difference=$netbitslength-$binip.Length 
$missing= "1" * $difference 
[string]$missing=$missing 
$missing=$missing.Padleft(16,'0') 
$binip=$binip+$missing 
$binip=$binip -replace ',','' 
$binstart=$binip.PadRight(128,'0') 
$binend=$binip.PadRight(128,'1') 
} 
elseIf($binip.Length -gt $netbitslength){ 
$binstart=$binip.substring(0,$netbits).padright(128,'0') 
$binend= $binip.substring(0,$netbits).padright(128,'1') 
} 
[email protected]() 
While ($binstart) 
{ 
$x,$binstart= ([char[]]$binstart).where({$_},'Split',16) 
$startbin+=$x -join '' 
} 
[email protected]() 
foreach($start in $startbin){ 
$start=[Convert]::ToInt32("$start",2) 
$starts+='{0:X4}' -f $start 
} 
$finalstartip=$starts -join ':' 
[email protected]() 
While ($binend) 
{ 
$x,$binend= ([char[]]$binend).where({$_},'Split',16) 
$endbin+=$x -join '' 
} 
[email protected]() 
foreach($end in $endbin){ 
$end=[Convert]::ToInt32("$end",2) 
$ends+='{0:X4}' -f $end 
} 
$finalendip=$ends -join ':' 
$ipv6range+=$finalstartip+'-'+$finalendip 
} 
関連する問題