Public/ConvertTo-IPv4NetworkAddress.ps1

Function ConvertTo-IPv4NetworkAddress {
    <#
        .SYNOPSIS
            Calculates the network address for a given IP address and subnet mask.
 
        .DESCRIPTION
            This function calculates the network address based on an IP address and either a subnet mask
            or prefix length (CIDR notation). For example, 192.168.1.0 is the network address of
            192.168.1.200/24 or 192.168.1.200 with subnet mask 255.255.255.0.
 
        .PARAMETER IPv4Address
            Specifies the IPv4 Address as string (e.g., "192.168.1.200").
            Must be a valid IPv4 address in dotted-decimal notation.
 
        .PARAMETER SubnetMask
            Specifies the IPv4 network mask as string (e.g., "255.255.255.0").
            Used in the SubnetMask parameter set.
 
        .PARAMETER PrefixLength
            Specifies the network prefix length, also known as CIDR notation (e.g., "24").
            Used in the PrefixLength parameter set.
 
        .INPUTS
            System.String
            You can pipe the IPv4 address as a string to this function.
 
        .OUTPUTS
            System.Net.IPAddress
            Returns an IPAddress object representing the network address.
 
        .EXAMPLE
            ConvertTo-IPv4NetworkAddress -IPv4Address "192.168.1.200" -SubnetMask "255.255.255.0"
 
            Returns 192.168.1.0 as the network address for the given IP and subnet mask.
 
        .EXAMPLE
            ConvertTo-IPv4NetworkAddress -IPv4Address "192.168.1.200" -PrefixLength "24"
 
            Returns 192.168.1.0 as the network address for the given IP and CIDR prefix.
 
        .EXAMPLE
            ConvertTo-IPv4NetworkAddress "192.168.1.200" "255.255.255.0"
 
            Uses positional parameters to calculate the network address.
 
        .EXAMPLE
            ConvertTo-IPv4NetworkAddress "192.168.1.200" "24"
 
            Uses positional parameters with a CIDR prefix length.
 
        .NOTES
            Used Functions:
                Name ║ Module/Namespace
                ═══════════════════════════════════════╬══════════════════════════════
                ConvertTo-IPv4Integer ║ EguibarIT
                ConvertTo-IntegerIPv4 ║ EguibarIT
                ConvertTo-IPv4MaskString ║ EguibarIT
                Write-Verbose ║ Microsoft.PowerShell.Utility
                Get-FunctionDisplay ║ EguibarIT
 
        .NOTES
            Version: 1.1
            DateModified: 22/May/2025
            LastModifiedBy: Vicente Rodriguez Eguibar
                            vicente@eguibar.com
                            Eguibar IT
                            http://www.eguibarit.com
 
        .LINK
            https://github.com/vreguibar/EguibarIT/blob/main/Public/ConvertTo-IPv4NetworkAddress.ps1
 
        .COMPONENT
            Networking
 
        .ROLE
            Utility
 
        .FUNCTIONALITY
            IP Address Calculation
    #>

    [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = 'Low')]
    [OutputType([System.Net.IpAddress])]

    Param (
        [Parameter(Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            ValueFromRemainingArguments = $false,
            HelpMessage = 'Specifies the IPv4 Address as string (e.g., 192.168.1.200)',
            Position = 0)]
        [String]
        $IPv4Address,

        [Parameter(Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            ValueFromRemainingArguments = $false,
            HelpMessage = 'Specifies the IPv4 network mask as string (e.g., 255.255.255.0)',
            ParameterSetName = 'SubnetMask',
            Position = 1)]
        [String]
        $SubnetMask,

        [Parameter(Mandatory = $true,
            ValueFromPipeline = $true,
            ValueFromPipelineByPropertyName = $true,
            ValueFromRemainingArguments = $false,
            HelpMessage = 'Specifies the network prefix length, also known as CIDR (e.g., 24)',
            ParameterSetName = 'PrefixLength',
            Position = 1)]
        [String]
        $PrefixLength
    )

    Begin {
        $txt = ($Variables.Header -f
            (Get-Date).ToString('dd/MMM/yyyy'),
            $MyInvocation.Mycommand,
            (Get-FunctionDisplay -HashTable $PsBoundParameters -Verbose:$False)
        )
        Write-Verbose -Message $txt

        ##############################
        # Module imports

        ##############################
        # Variables Definition

        $IntegerIPv4Address = 0
        $IntegerIPv4SubnetMask = 0
        $IntegerNetworkAddress = 0
        [IpAddress]$NetworkAddress
    } #end Begin

    Process {
        # Get IPv4 address as an Integer
        $IntegerIPv4Address = ConvertTo-IPv4Integer -Ipv4Address $IPv4Address
        Write-Verbose -Message ('IP Address {0} to Integer: {1}' -f $IPv4Address, $IntegerIPv4Address)

        # Get IPv4 subnet mask as an Integer
        If ($PSCmdlet.ParameterSetName -eq 'PrefixLength') {
            $SubnetMask = (ConvertTo-IPv4MaskString -MaskBits $PrefixLength).ToString()
            Write-Verbose -Message ('PrefixLength of {0} to Integer: {1}' -f $SubnetMask, $IntegerIPv4SubnetMask)
        }

        $IntegerIPv4SubnetMask = ConvertTo-IPv4Integer -Ipv4Address $SubnetMask
        Write-Verbose -Message ('SubnetMask {0} to Integer: {1}' -f $SubnetMask, $IntegerIPv4SubnetMask)

        # BitwiseAnd IpAddress and Subnet mask
        $IntegerNetworkAddress = $IntegerIPv4Address -band $IntegerIPv4SubnetMask

        # Convert Integer to Network Address
        $NetworkAddress = ConvertTo-IntegerIPv4 -Integer $IntegerNetworkAddress
        Write-Verbose -Message ('Network Address {0} to Integer: {1}' -f $NetworkAddress, $IntegerNetworkAddress)
    } #end Process

    End {
        $txt = ($Variables.Footer -f $MyInvocation.InvocationName,
            'finding network address based on IP Address and Subnet Mask.'
        )
        Write-Verbose -Message $txt

        return $NetworkAddress
    } #end End
} #end Function