BAT, который извлекает IP-адреса и заполняет 0-е

#windows #batch-file #command-line

#Windows #пакетный файл #командная строка

Вопрос:

Я пробовал очень многими способами добиться этого, получить IP с помощью пакетного скрипта, затем удалить точки (.) и постоянно заполнять все подсегменты длиной в 3 числа, например:

192.168.59.1 должно быть 192168059001

Пока я придумал это:

 set "str2=.pfx"
for /f "delims=[] tokens=2" %%a in ('ping %computername% -4 -n  1 ^| findstr "["') do (set thisip=%%a)
SET _result=%thisip:.=%
SET "ip=%_result%%str2%"
  

И вместо этого я получаю: _result=192168591, я попытался добавить 00 следующим образом:

 set "str2=.pfx"
for /f "delims=[] tokens=2" %%a in ('ping %computername% -4 -n  1 ^| findstr "["') do (set thisip=00%%a)
SET _result=%thisip:.=00%
SET "ip=%_result%%str2%"
  

И я получаю: _result=00192001680059001

Как мне сохранить фиксированную длину в 3 цифры для каждого подсегмента?

Комментарии:

1. Вам нужно будет поместить каждый октет в свою собственную переменную. Затем добавьте начальные нули к каждой переменной. Затем добавьте в подстроку последние три символа из каждой переменной.

Ответ №1:

 @echo off
setlocal EnableDelayedExpansion

for /F "delims=[] tokens=2" %%a in ('ping %computername% -4 -n 1') do set "thisip=%%a"
set "_result="
for %%a in (%thisip:.=,%) do set "part=00%%a" amp; set "_result=!_result!!part:~-3!"
echo %_result%
  

Комментарии:

1. Спасибо! Вы должны отметить это как лучший ответ, чтобы сообщить сообществу, что этот вопрос уже решен…

Ответ №2:

 for /f "delims=[] tokens=2" %%a in ('ping %computername% -4 -n  1 ^| findstr "["') do (set thisip=%%a)

for /f "tokens=1-4 delims=." %%a in ("%thisip%") do (
  set a=00%%a
  set b=00%%b
  set c=00%%c
  set d=00%%d
)
echo %a:~-3%%b:~-3%%c:~-3%%d:~-3% 
  

Комментарии:

1. Спасибо, мне нужно было только установить результат в переменную

Ответ №3:

Попробуйте это:

 @ECHO OFF
FOR /F "TOKENS=2-5 DELIMS=[.]" %%A in ('PING -n 1 "%COMPUTERNAME%" -4') DO (
    IF DEFINED ONE GOTO :EndIt
    SET/A ONE=100%%A, TWO=100%%B, THREE=100%%C, FOUR=100%%D
    CALL SET MyIP=%%ONE:~-3%%%%TWO:~-3%%%%THREE:~-3%%%%FOUR:~-3%%)
:EndIt
ECHO=%MyIP%
TIMEOUT -1 1>NUL
  

Ответ №4:

Вот однострочное решение PowerShell:

 PowerShell.exe -c "'{0:000}{1:000}{2:000}{3:000}' -f [BitConverter]::GetBytes([Net.Dns]::GetHostByName($env:COMPUTERNAME).AddressList[0].Address)[0..3]"
  

[Net.Dns]::GetHostByName($env:COMPUTERNAME) использует GetHostByName функцию .NET для получения IP-адреса локального компьютера. Затем этот скрипт принимает первый элемент AddressList поля и получает его свойство integer Address . GetBytes Затем метод преобразует это в массив байтов. Первые 4 из них затем форматируются с использованием .Строка сетевого формата {N:000} для печати в виде целого числа с заполнением нуля до трех знаков после запятой.

Этот метод использует DNS API для поиска адреса, что означает, что он не отправляет ping и не ожидает его возврата.

Недостатком вызова PowerShell является то, что загрузка .NET framework в память может добавить некоторую задержку (хотя и намного меньшую, чем при запуске PING ). Это проблема, только если вы не запускаете какие-либо приложения .NET, C # или PowerShell на том же компьютере.

Комментарии:

1. Большое вам спасибо

Ответ №5:

Просто чтобы включить решение без операций с подстроками

 @echo off
    setlocal enableextensions disabledelayedexpansion

    set "host=%~1" amp; if not defined host set "host=localhost"

    for /f "tokens=2 delims=[]" %%z in ('ping -4 -n 1 %host%') do (
        for /f "tokens=1-4 delims=." %%a in ("%%z") do for /f "delims=" %%e in ('
            for %%f in (%%a %%b %%c %%d^) do @(
                set/a"%%f/100"^amp;set/a"%%f%0/10"^amp;set/a"%%f%"
            ^)
        ') do echo Host [%host%] = %%z = %%e
    )