Изменить 3-й октет IP в формате строки с помощью PowerShell - PullRequest
0 голосов
/ 27 февраля 2019

Думаю, я нашел худший способ сделать это:

$ip = "192.168.13.1"
$a,$b,$c,$d = $ip.Split(".")
[int]$c = $c
$c = $c+1
[string]$c = $c
$newIP = $a+"."+$b+"."+$c+"."+$d

$newIP

Но какой путь лучше?Должен быть строкой, когда закончено.Не беспокоиться о проверке его законного IP.

Ответы [ 6 ]

0 голосов
/ 27 февраля 2019

Для завершения вашего метода, но в ближайшее время:

$a,$b,$c,$d = "192.168.13.1".Split(".")
$IP="$a.$b.$([int]$c+1).$d"
0 голосов
/ 27 февраля 2019

Если у вас PowerShell Core (v6.1 или выше), вы можете объединить -replace с блоком сценариев на основе замены:

PS> '192.168.13.1' -replace '(?<=^(\d+\.){2})\d+', { 1 + $_.Value }
192.168.14.1
  • Отрицательное обратное утверждение (?<=^(\d+\.){2}) соответствует всему, вплоть до 3-го октета, но не включая его, не считая его частью общего совпадения для замены,

    • (?<=...) является проверочным утверждением, \d+ соответствует одной или нескольким (+) цифрам (\d), \. a литерал ., а {2} соответствует предыдущему подвыражению ((...)) 2 раза.
  • \d+, затем соответствует только 3-му октету;поскольку больше ничего не найдено, оставшаяся часть строки (. и 4-й октет) остается на месте.

  • Внутри блока сценария замены ({ ... }), $_ относится к результатам матча в виде экземпляра [MatchInfo];.Value - это совпадающая строка, то есть 3-й октет, к которому можно добавить 1.

    • Примечание к типу данных: используя 1, неявное [int] в качестве LHS , RHS (строка .Value ) неявно приводится к [int] (вы можете использовать явное приведение).
      При выводе независимо от сценариявозврат блока автоматически приводится к строке .

Если вы должны поддерживать совместимость с Windows PowerShell , рассмотрите Полезный ответ Джеффа Цейтлина .

0 голосов
/ 27 февраля 2019

Вы можете просто использовать -replace оператор PowerShell и шаблон просмотра в будущее.Посмотрите на этот скрипт ниже

Set-StrictMode -Version "2.0"
$ErrorActionPreference="Stop"
cls
$ip1 = "192.168.13.123"
$tests=@("192.168.13.123" , "192.168.13.1" , "192.168.13.12")
foreach($test in $tests)
{
    $patternRegex="\d{1,3}(?=\.\d{1,3}$)"
    $newOctet="420"
    $ipNew=$test -replace $patternRegex,$newOctet
    $msg="OLD ip={0} NEW ip={1}" -f $test,$ipNew
    Write-Host $msg

}

Это даст следующее:

OLD ip=192.168.13.123 NEW ip=192.168.420.123
OLD ip=192.168.13.1 NEW ip=192.168.420.1
OLD ip=192.168.13.12 NEW ip=192.168.420.12

Как использовать оператор -replace?

https://powershell.org/2013/08/regular-expressions-are-a-replaces-best-friend/

Понимание схемы, которую я использовал

(? =) В \ d {1,3} (? =. \ D {1,3} $) значит оглянуться назад.

(? =. \ D {1,3} $ in \ d {1,3} (? =. \ D {1,3} $) означает что-либо позади DOT и 1-3 цифры.

Начальная \ d {1,3} - это инструкция для точного совпадения 1-3 цифр

Все в простом английском языке " Дайте мне 1-3 цифры позадиточка и 1-3 цифры, расположенные по направлению к правой границе строки"

Регулярное выражение

https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

ИСПРАВЛЕНИЕ

Шаблон регулярного выражения - это взгляд вперед , а не взгляд назад .

0 голосов
/ 27 февраля 2019

вот немного другой метод.[ ухмылка ] Мне удалось не заметить ответ Джеффа Цейтлина, пока я не закончил это.

[edit - спасибо JeffZeitlin за напоминание, что ОП хочет получить конечный результат в виде строки.упс![* blush *]]

что он делает ...

  • разбивает строку на точки
  • помещает это в массив [int]& приводит элементы к этому типу
  • увеличивает элемент в целевом слоте
  • объединяет элементы обратно в строку с точкой для разделителя
  • преобразует это в IPтип адреса
  • добавляет строку для преобразования IP-адреса в строку

вот код ...

$OriginalIPv4 = '1.1.1.1'
$TargetOctet = 3

$OctetList = [int[]]$OriginalIPv4.Split('.')
$OctetList[$TargetOctet - 1]++

$NewIPv4 = [ipaddress]($OctetList -join '.')

$NewIPv4
'=' * 30
$NewIPv4.IPAddressToString

output ...

Address            : 16908545
AddressFamily      : InterNetwork
ScopeId            : 
IsIPv6Multicast    : False
IsIPv6LinkLocal    : False
IsIPv6SiteLocal    : False
IsIPv6Teredo       : False
IsIPv4MappedToIPv6 : False
IPAddressToString  : 1.1.2.1

==============================
1.1.2.1
0 голосов
/ 27 февраля 2019
function Replace-3rdOctet {
    Param(
        [string]$GivenIP,
        [string]$New3rdOctet
    )
    $GivenIP -match '(\d{1,3}).(\d{1,3}).(\d{1,3}).(\d{1,3})' | Out-Null
    $Output = "$($matches[1]).$($matches[2]).$New3rdOctet.$($matches[4])"
    Return $Output
}

Скопируйте в файл ps1 и поставьте точку в командной строке, затем введите

Replace-3rdOctet -GivenIP '100.201.190.150' -New3rdOctet '42'

Вывод: 100.201.42.150

Оттуда вы можете добавить дополнительную обработку ошибок и т. Д.для случайного ввода и т. д.

0 голосов
/ 27 февраля 2019

Используя ваш пример того, как вы хотите изменить третий октет, я бы сделал это примерно так же, но я бы сжал некоторые шаги вместе:

$IP = "192.168.13.1"
$octets = $IP.Split(".")                        # or $octets = $IP -split "\."
$octets[2] = [string]([int]$octets[2] + 1)      # or other manipulation of the third octet
$newIP = $octets -join "."

$newIP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...