Functions/Get-IPrange.ps1

function Get-IPrange {
    <#
    .SYNOPSIS
        Lists IPs within a range, subnet, or CIDR block.
 
    .DESCRIPTION
        Lists IPs within a range, subnet, or CIDR block.
 
    .PARAMETER CIDR
        Specifies what CIDR block notation you want to list IPs from.
 
    .PARAMETER End
        The ending IP in a range.
 
    .PARAMETER IP
        An IP from the subnet mask or CIDR block you want a range for.
 
    .PARAMETER Start
        Specifies a path to one or more locations.
 
    .PARAMETER Subnet
        The subnet mask you want a range for.
 
    .EXAMPLE
        C:\PS>Get-IPrange -ip 192.168.0.3 -subnet 255.255.255.192
        Will show all IPs within the 192.168.0.0 space with a subnet mask of 255.255.255.192 (CIDR 26.)
 
    .EXAMPLE
        C:\PS>Get-IPrange -PARAMETER
        Another example of how to use this cmdlet but with a parameter or switch.
 
    .NOTES
        Author: Skyler Hart
        Created: Sometime before 8/7/2017
        Last Edit: 2020-08-20 09:11:46
 
    .LINK
        https://wanderingstag.github.io
    #>

    [CmdletBinding()]
    Param (
        [Parameter(
            Mandatory=$false,
            Position=0
        )]
        [Alias('IPv4','Address','IPv4Address')]
        [string]$IP,

        [Parameter(
            Mandatory=$false
        )]
        [Alias('Notation','Block')]
        [string]$CIDR,

        [Parameter(
            Mandatory=$false
        )]
        [Alias('Mask')]
        [string]$Subnet,

        [Parameter(
            Mandatory=$false
        )]
        [string]$Start,

        [Parameter(
            Mandatory=$false
        )]
        [string]$End
    )


    if ($IP) {$ipaddr = [Net.IPAddress]::Parse($IP)}
    if ($CIDR) {$maskaddr = [Net.IPAddress]::Parse((Convert-INT64toIP -int ([convert]::ToInt64(("1"*$CIDR+"0"*(32-$CIDR)),2)))) }
    if ($Subnet) {$maskaddr = [Net.IPAddress]::Parse($Subnet)}
    if ($IP) {$networkaddr = new-object net.ipaddress ($maskaddr.address -band $ipaddr.address)}
    if ($IP) {$broadcastaddr = new-object net.ipaddress (([system.net.ipaddress]::parse("255.255.255.255").address -bxor $maskaddr.address -bor $networkaddr.address))}

    if ($IP) {
        $startaddr = Convert-IPtoINT64 -IP $networkaddr.ipaddresstostring
        $endaddr = Convert-IPtoINT64 -IP $broadcastaddr.ipaddresstostring
    } else {
        $startaddr = Convert-IPtoINT64 -IP $start
        $endaddr = Convert-IPtoINT64 -IP $end
    }

    for ($i = $startaddr; $i -le $endaddr; $i++) {
        Convert-INT64toIP -int $i
    }
}