powershell(その3)

powershellIPアドレス計算(失敗)

PS C:\> $ipaddr = "10.10.10.10"
PS C:\> ($ipaddr.GetType()).name -eq [ipaddress]
False
PS C:\> ($ipaddr.GetType()).name
String

だとうまくいかない

powershellIPアドレス計算(成功)

PS C:\> $ipaddr = [ipaddress]"10.10.10.10"
PS C:\> ($ipaddr.GetType()).name -eq [ipaddress]
True
PS C:\> ($ipaddr.GetType()).name
IPAddress

IPアドレスサブネットマスクからネットワークアドレスを計算

PS C:\> $ipaddr = [ipaddress]"10.10.10.10"
PS C:\> $netmask =[ipaddress] "255.255.255.0"
PS C:\> ([ipaddress]($ipaddr.Address -band $netmask.Address)).IPAddressToString
10.10.10.0

cidr からネットマスクな形式への変換(失敗)

ネットマスクをネットマスクらしいビット列で扱ってくれてなさそう。。。

PS C:\Users\eiji> $addr = [ipaddress]"255.255.255.255"
PS C:\Users\eiji> [convert]::tostring($addr.Address,2)
11111111111111111111111111111111
PS C:\Users\eiji> ([convert]::tostring($addr.Address,2)).length
32
PS C:\Users\eiji> $addr = [ipaddress]"255.255.255.0"
PS C:\Users\eiji> [convert]::tostring($addr.Address,2)
111111111111111111111111
PS C:\Users\eiji> ([convert]::tostring($addr.Address,2)).length
24
PS C:\Users\eiji> $addr = [ipaddress]"255.255.0.0"
PS C:\Users\eiji> [convert]::tostring($addr.Address,2)
1111111111111111
PS C:\Users\eiji> ([convert]::tostring($addr.Address,2)).length
16
PS C:\Users\eiji> $addr = [ipaddress]"255.0.0.0"
PS C:\Users\eiji> [convert]::tostring($addr.Address,2)
11111111
PS C:\Users\eiji> ([convert]::tostring($addr.Address,2)).length
8
PS C:\Users\eiji> $addr = [ipaddress]"255.255.255.128"
PS C:\Users\eiji> [convert]::tostring($addr.Address,2)
10000000111111111111111111111111
PS C:\Users\eiji> ([convert]::tostring($addr.Address,2)).length
32
PS C:\Users\eiji> $addr = [ipaddress]"255.255.128.0"
PS C:\Users\eiji> [convert]::tostring($addr.Address,2)
100000001111111111111111
PS C:\Users\eiji> ([convert]::tostring($addr.Address,2)).length
24

cidr からネットマスクな形式への変換(成功)

自力ではちょっと挫折。以下を参照。。
PowerShell で IPv4 アドレス計算

PS C:\> $subnet = $null
PS C:\> $cidr = 25
PS C:\> $cidr
25

for( $i = 0 ; $i -lt 4 ; $i++ ){
    if( $cidr -ge 8 ){
        $subnet += "255"
        $cidr -= 8
    }
    elseif($cidr -le 0){
        $subnet += "0"
        $cidr = 0
    }
    else{
        $node = [Math]::Pow(2,8 - $cidr)
        $subnetinoctet = 256 - $node
        $subnet += [string]$subnetinoctet
        $cidr = 0
    }
    
    if( $i -ne 3 ){
        $subnet += "."
    }
}

PS C:\> $subnet
255.255.255.128