String 我只想使用powershell替换字符串的某些字符

String 我只想使用powershell替换字符串的某些字符,string,powershell,networking,replace,scripting,String,Powershell,Networking,Replace,Scripting,我正在编写一个powershell脚本,它使用ip地址生成网络地址(10.12.142.12to10.12.142.0),我将处理的所有ip地址都遵循以下格式10.xxx.xxx.12 我试过用这个。它一直工作,直到ip地址如下所示10.12.154.12或10.214.126.12。它捕获并替换所有.12。我也试过一些正则表达式,但找不出一个只匹配最后八位字节的表达式 $ipAddress = "10.12.23.12" $networkNumber = $ipAddress.replace(

我正在编写一个powershell脚本,它使用ip地址生成网络地址(
10.12.142.12
to
10.12.142.0
),我将处理的所有ip地址都遵循以下格式
10.xxx.xxx.12

我试过用这个。它一直工作,直到ip地址如下所示
10.12.154.12
10.214.126.12
。它捕获并替换所有
.12
。我也试过一些正则表达式,但找不出一个只匹配最后八位字节的表达式

$ipAddress = "10.12.23.12"
$networkNumber = $ipAddress.replace(".12",".0")

我想要
10.12.23.0
,但是我得到
10.0.23.0
或者用
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

您可以对字符串使用
拆分
联接
方法:

$ipAddress = "10.12.23.12"
$parts = $ipAddress.Split(".")
$parts[3] = "0"
$networkNumber = [String]::Join(".", $parts)

另一个选项是使用
substring()
LastIndexOf()
提取最后一个
之前的子字符串,然后使用
0
连接:

PS C:\> $ipAddress = "10.12.23.12"                                                              
PS C:\> $ipAddress.Substring(0, $ipAddress.LastIndexOf('.') + 1) + '0'
10.12.23.0

这可能有些过分,但由于网络地址与子网掩码直接相关,因此此函数将考虑这一点

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