2017-02-08 19 views
0

Powershell의 범위 (first_address-last_address)에 CIDR 표기법과 함께 제공되는 지정된 IPv6 범위를 변환하려고하지만 조금 벗어납니다.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 

내가 광범위하게 검색 좀 있지만, PowerShell에 대한 올바른 방향으로 나를 지적한 것을 발견하지 못했습니다. PHP와 JS 예제를 발견했지만 잘 번역하지 못했습니다.

모든 포인터?

감사!

+0

- '억제 해제'0을 선도하고, 0을 작성하는 :: 대신에 사용하십시오. (예 :'2a01 : 111 : f406 : c00 ::/64'는'2a01 : 0111 : f406 : 0c00 : 0000 : 0000 : 0000 : 0000/64'로 변환됩니다. 귀하의 목적을 달성하는 방법을 쉽게 해결할 수 있습니다. –

+0

추가 힌트 :'-split'과'-f' 연산자가 도움이 될 수 있습니다. –

+0

@JeffZeitlin 고맙습니다. 실현 가능한 해결책입니다. 그러나 어떤 경우에 대해서도 정확성에 대해 우려하고 있습니다. (목록에 100+가 있습니다.) –

답변

3

AFAIK는 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 
} 
나는 "정상화"당신은 고정 된 형식이되도록 주어진 CIDR의 형식으로 시작하는 것을 권 해드립니다