【问题标题】:BAT that retrieves IP and pads 0's检索 IP 并填充 0 的 BAT
【发布时间】:2016-10-21 18:51:12
【问题描述】:

我尝试了很多方法来实现这一点,通过批处理脚本检索 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 位的固定长度?

【问题讨论】:

  • 您必须将每个八位字节放入自己的变量中。然后将前导零添加到每个变量。然后对每个变量的最后三个字符进行子串化。

标签: windows batch-file command-line


【解决方案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" & set "_result=!_result!!part:~-3!"
echo %_result%

【讨论】:

  • 谢谢!您应该将此标记为最佳答案,让社区知道这个问题已经解决...
【解决方案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% 

【讨论】:

  • 谢谢,我只需要将结果设置为变量
【解决方案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) 使用 .NET 的 GetHostByName 函数获取本地计算机的 IP 地址。然后,此脚本获取 AddressList 字段的第一个元素并获取其整数 Address 属性。 GetBytes 方法然后将其转换为字节数组。然后使用 .NET 格式字符串 {N:000} 对其中的前 4 个进行格式化,以打印为整数,零填充到小数点后三位。

    此方法使用 DNS API 来查找地址,这意味着它不会发送 ping 并等待它返回。

    调用 PowerShell 的缺点是将 .NET 框架加载到内存中会增加一些延迟(尽管比运行 PING 要少得多)。如果您没有在同一台计算机上运行任何 .NET、C# 或 PowerShell 应用程序,这只是一个问题。

    【讨论】:

    • 非常感谢
    【解决方案5】:

    只是为了包含一个没有子字符串操作的解决方案

    @echo off
        setlocal enableextensions disabledelayedexpansion
    
        set "host=%~1" & 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"^&set/a"%%f%%100/10"^&set/a"%%f%%10"
                ^)
            ') do echo Host [%host%] = %%z = %%e
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多