Powershell - 基于 CSV 文件检查 IP 地址范围 [英] Powershell - Checking IP Address range based on CSV file

查看:50
本文介绍了Powershell - 基于 CSV 文件检查 IP 地址范围的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在开发 VM 配置脚本.我的问题是:我有如下所示的此处字符串.现在,我想根据 ip 地址范围添加 route .我正在使用带有 BACKUPIP 列的 CSV 文件.

I have been developing VM provision script. My question is : I have here-string like below. now , I want to add route based on ip address range. I am using CSV file with BACKUPIP column.

如果 BACKUPIP 在 10.10.104.110.10.107.254 范围内,它将起作用 route add xx.xx.xx.xx mask 255.255.255.0 xx.xx.xx.xx -p

if an BACKUPIP is in range 10.10.104.1 to 10.10.107.254 it will work route add xx.xx.xx.xx mask 255.255.255.0 xx.xx.xx.xx -p

如果 BACKUPIP 在 10.10.180.110.10.185.254 范围内,它将起作用 route add yy.yy.yy.yy mask 255.255.255.0 yy.yy.yy.yy -p

if an BACKUPIP is in range 10.10.180.1 to 10.10.185.254 it will work route add yy.yy.yy.yy mask 255.255.255.0 yy.yy.yy.yy -p

这是我的脚本:

Import-Csv -Path .\vm.csv -UseCulture -PipelineVariable row |

ForEach-Object -Process {


    # Create the VM, store result in $vm


    if($($row.IP) -eq '???'){
            route add xx.xx.xx.xx mask 255.255.255.0 xx.xx.xx.xx -p
            }
    else{
            
            route add yy.yy.yy.yy mask 255.255.255.0 yy.yy.yy.yy -p
            
            }


}

最后更新:

$rangeFrom104 = '10.10.104.1'
$rangeTo107 = '10.10.107.254'

$rangeFrom180 = '10.10.180.1'
$rangeTo185 = '10.10.185.254'

     

if (([version]$rangeFrom104) -lt ([version]$($row.IP)) -and ([version]$($row.IP)) -lt ([version]$rangeTo107) )
{

route add xx.xx.xx.xx mask 255.255.255.0 xx.xx.xx.xx -p

}

elseif (([version]$rangeFrom180) -lt ([version]$($row.IP)) -and ([version]$($row.IP)) -lt ([version]$rangeTo185) )
{

route add yy.yy.yy.yy mask 255.255.255.0 yy.yy.yy.yy -p

}

推荐答案

非常喜欢 [Version] 方法 Lee_Dailey 建议.

Really like the [Version] approach Lee_Dailey suggested.

这是将 IP 地址转换为其数值的另一种方法:

Here's another approach that converts the IP addresses to their numeric values:

function Convert-IPv4ToDecimal ([string]$IpAddress){
    # helper function to return the numeric value (uint32) of a dotted IP
    # address string used for testing if an IP address is in range.
    $n = [uint32[]]$IpAddress.Split('.')
    # or use: $n = [uint32[]]([IpAddress]$IpAddress).GetAddressBytes()

    # to get the obsolete property ([IpAddress]$IpAddress).Address
    # you need to do the math in reversed order.
    # return [uint32] ($n[3] -shl 24) + ($n[2] -shl 16) + ($n[1] -shl 8) + $n[0]

    # for comparing different ranges as in this question, do not reverse the byte order
    return [uint32] ($n[0] -shl 24) + ($n[1] -shl 16) + ($n[2] -shl 8) + $n[3]
}



$startRange1 = Convert-IPv4ToDecimal '172.25.104.1'
$endRange1   = Convert-IPv4ToDecimal '172.25.107.254'

$startRange2 = Convert-IPv4ToDecimal '172.25.112.1'
$endRange2   = Convert-IPv4ToDecimal '172.25.115.254'

Import-Csv -Path .\vm.csv -UseCulture | ForEach-Object {
    # Create the VM, store result in $vm

    # convert the .BACKUPIP to numeric value
    $backupIp = Convert-IPv4ToDecimal $_.BACKUPIP
    # test the IP range
    if ($backupIp -ge $startRange1 -and $backupIp -le $endRange1) {
        Write-Host "BACKUPIP '$($_.BACKUPIP)' is in Range 1"
        route add xx.xx.xx.xx mask 255.255.255.0 xx.xx.xx.xx -p
    }
    elseif ($backupIp -ge $startRange2 -and $backupIp -le $endRange2) {
        Write-Host "BACKUPIP '$($_.BACKUPIP)' is in Range 2"
        route add yy.yy.yy.yy mask 255.255.255.0 yy.yy.yy.yy -p
    }
    else {
        Write-Warning "No range defined for IP address '$($_.BACKUPIP)'"
    }
}

这篇关于Powershell - 基于 CSV 文件检查 IP 地址范围的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆