我可以使用以下方法提取我的计算机主机IP地址:
$IPAddr = Get-NetIPConfiguration -InterfaceAlias "Ethernet" | select IPv4Address
如何根据子网掩码(例如
/24
,/20
,/16
等)获取其对应的子网地址?如果主机IP地址为
192.168.100.45
,子网掩码为/24
或255.255.255.0
,则代码应该获取子网地址值为192.168.100.0
。我可以使用以下方法提取我的计算机主机IP地址:
$IPAddr = Get-NetIPConfiguration -InterfaceAlias "Ethernet" | select IPv4Address
/24
,/20
,/16
等)获取其对应的子网地址?192.168.100.45
,子网掩码为/24
或255.255.255.0
,则代码应该获取子网地址值为192.168.100.0
。IPAddress
类。例如:[IPAddress] (([IPAddress] "192.168.100.45").Address -band ([IPAddress] "255.255.255.0").Address)
这将输出一个包含IP地址192.168.100.0
的IPAddress
对象。
要将位数转换为等效的掩码字符串,您可以使用以下函数:
function ConvertTo-IPv4MaskString {
param(
[Parameter(Mandatory = $true)]
[ValidateRange(0, 32)]
[Int] $MaskBits
)
$mask = ([Math]::Pow(2, $MaskBits) - 1) * [Math]::Pow(2, (32 - $MaskBits))
$bytes = [BitConverter]::GetBytes([UInt32] $mask)
(($bytes.Count - 1)..0 | ForEach-Object { [String] $bytes[$_] }) -join "."
}
[IPAddress] (([IPAddress] "192.168.100.45").Address -band ([IPAddress] (ConvertTo-IPv4MaskString 24)).Address)
这将输出包含IP地址192.168.100.0
的IPAddress
对象。
还有一些其他有用的函数:
function Test-IPv4MaskString {
param(
[Parameter(Mandatory = $true)]
[String] $MaskString
)
$validBytes = '0|128|192|224|240|248|252|254|255'
$MaskString -match `
('^((({0})\.0\.0\.0)|' -f $validBytes) +
('(255\.({0})\.0\.0)|' -f $validBytes) +
('(255\.255\.({0})\.0)|' -f $validBytes) +
('(255\.255\.255\.({0})))$' -f $validBytes)
}
function ConvertTo-IPv4MaskBits {
param(
[parameter(Mandatory = $true)]
[ValidateScript({Test-IPv4MaskString $_})]
[String] $MaskString
)
$mask = ([IPAddress] $MaskString).Address
for ( $bitCount = 0; $mask -ne 0; $bitCount++ ) {
$mask = $mask -band ($mask - 1)
}
$bitCount
}
ConvertTo-IPv4MaskBits
是ConvertTo-IPv4MaskString
的反函数,它使用Test-IPv4MaskString
来验证掩码是否为有效的IPv4掩码。微软的IP地址实现非常慢,而且不幸的是他们也将八进制值按错误顺序排列。对于所有与IP相关的计算,我决定使用自己的函数效果更好。这是我的代码片段:
function ipNr($s) {
[byte[]]$ip = $s.Split(".")
[array]::Reverse($ip)
[bitconverter]::ToUInt32($ip,0)
}
function ipString($n) {
$ip = [bitconverter]::GetBytes($n)
[array]::Reverse($ip)
[string]::Join(".", $ip)
}
function maskNr($b) {
(1 -shl $b)-1 -shl (32-$b)
}
$ip = "192.168.100.45"
$prefixLength = 24
$subnetId = ipString ((ipNr $ip) -band (maskNr $prefixLength))
write-host "$subnetId/$prefixLength"
$IPAddr
的值(即192.168.100.45
)和其 CIDR 子网掩码/24
转换为相应的网络地址192.168.100.0
的指导,并将其传递给另一个变量以用于脚本的另一部分。 - Jeenetsh
输出的结果吗?比如说,netsh interface ip show config 'Ethernet'
? - vonPryznetsh
单行输出中剥离子网地址值,并直接将该值传递给另一个命令的变量,那么这绝对值得一试。 - Jee