我正在编写一个Powershell脚本,该脚本使用ip地址生成网络地址(10.12.142.12
至10.12.142.0
)。我将要处理的所有ip地址都遵循以下格式{{1} }
我尝试使用String.Replace()
method。直到IP地址类似于以下10.xxx.xxx.12
或10.12.154.12
为止,它一直有效。它抓取并替换所有10.214.126.12
。 Ive还尝试了一些正则表达式,但无法提供仅与最后一个八位位组匹配的表达式。
.12
我想要$ipAddress = "10.12.23.12"
$networkNumber = $ipAddress.replace(".12",".0")
,但我得到10.12.23.0
答案 0 :(得分:4)
或者使用.
和String.Remove()
从最后一个String.LastIndexOf()
中删除所有内容,然后添加.0
:
$ipAddress = "10.12.23.12"
$network = $ipAddress.Remove($ipAddress.LastIndexOf('.')) + '.0'
或使用仅替换字符串末尾的.12
的正则表达式:
$ipAddress = "10.12.23.12"
$network = $ipAddress -replace '\.\d{1,3}$','.0'
这两个选项都可以在最后一个八位位组中使用任何值,而不仅仅是.12
答案 1 :(得分:3)
您可以在字符串上使用Split
和Join
方法:
$ipAddress = "10.12.23.12"
$parts = $ipAddress.Split(".")
$parts[3] = "0"
$networkNumber = [String]::Join(".", $parts)
答案 2 :(得分:1)
另一种选择是提取包含.
和Substring()
的最后一个LastIndexOf()
之前的子字符串,然后包括0
:
PS C:\> $ipAddress = "10.12.23.12"
PS C:\> $ipAddress.Substring(0, $ipAddress.LastIndexOf('.') + 1) + '0'
10.12.23.0
答案 3 :(得分:1)
这可能是矫kill过正,但是由于网络地址与子网掩码直接相关,因此此功能会将其考虑在内。
Function Get-NetAddress {
param($IPAddress,$SubnetMask)
$IPArray = $IPAddress -split "\."
$MaskArray = $SubnetMask -split "\."
$output = for ($i = 0; $i -lt 4; $i++) {
$IPArray[$i] -band $MaskArray[$i]
}
$output -join "."
}
输出样本:
Get-NetAddress 192.168.7.1 255.255.248.0
192.168.0.0
Get-NetAddress 10.20.30.40 255.255.0.0
10.20.0.0
Get-NetAddress 10.20.30.250 255.255.255.0
10.20.30.0
Get-NetAddress 10.20.30.171 255.255.255.224
10.20.30.160