1

我正在尝试创建一个端口转发我的 IP 的批处理文件。可以通过命令找到IP ipconfig | findstr IPv4,但是有多个网卡和多个IP地址。我只想得到一个地址192.168.40.??

192.168.56.1 和 192.168.56.2 是我的 VirtualBox 适配器。我不确定如何在 if 语句中设置条件。

这是 Windows 批处理文件 (*.bat):

ipconfig,findstr:

D:\>ipconfig | findstr IPv4
   IPv4 adress . . . . . . . . . : 192.168.56.2
   IPv4 adress . . . . . . . . . : 192.168.56.1
   IPv4 adress . . . . . . . . . : 192.168.40.19

我尝试了以下批处理文件:

@echo off
setlocal
setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr IPv4`) do (
  for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do (
    for /f "tokens=1-4 delims=." %%c in ("%%b") do (
      set _o1=%%c
      set _o2=%%d
      set _o3=%%e
      set _o4=%%f
      set _4octet=!_o1:~1!.!_o2!.!_o3!.!_o4!     
      echo ==start port fowarding==
      netsh interface portproxy add v4tov4 listenport=8080 listenaddress=!_4octet! connectport=8080 connectaddress=192.168.56.1
      echo ========================
      netsh interface portproxy show v4tov4
     )
    )
  )
endlocal

但这在我所有的适配器上运行:

address         port        address         port
--------------- ----------  --------------- ----------
192.168.56.2    8080        192.168.56.1    8080          <- not want   
192.168.56.1    8080        192.168.56.1    8080          <- not want
192.168.40.19   8080        192.168.56.1    8080          <- i want only

然后我尝试了:

@echo off
setlocal
setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%a in (`ipconfig ^| findstr IPv4`) do (
  for /f delims^=^:^ tokens^=2 %%b in ('echo %%a') do (
    for /f "tokens=1-4 delims=." %%c in ("%%b") do (
      set _o1=%%c
      set _o2=%%d
      set _o3=%%e
      set _o4=%%f
      set _4octet=!_o1:~1!.!_o2!.!_o3!.!_o4!     
      echo ==start port fowarding==
      if !_4octet!==192.168.56.1
      (
      )
      else if !_4octet!==192.168.56.2
      (
      )
      else
      netsh interface portproxy add v4tov4 listenport=8080 listenaddress=!_4octet! connectport=8080 connectaddress=192.168.56.1
      echo ========================
      netsh interface portproxy show v4tov4
     )
    )
  )
endlocal

但我收到错误:

该命令的语法不正确。

也许原因是变量 (!_4octet!) 工作不正常。

  if !_4octet! == 192.168.56.1 (

你能帮我解决这个问题吗?

4

2 回答 2

1

如果你想得到这样的 ip192.168.40.*

您可以在命令中使用一些正则表达式,findstr如下所示:

ipconfig | findstr IPv4 | findstr /r /c:"192.168.40.*"

您可以在这里找到更多帮助findstr /?

/R /C:string 使用字符串作为正则表达式。

因此,您可以使用批处理脚本将 IP 设置为变量,如下所示:

@echo off
SetLocal EnableDelayedExpansion
for /f "usebackq delims=: tokens=2" %%a in (`ipconfig ^| findstr IPv4 ^| findstr /r /c:"192.168.40.*"`) do (
    Set "MyIP=%%a"
    Set "MyIP=!MyIP!"
    set "MyIP=!MyIP: =!" 
)
echo MyIP="!MyIP!"
pause
于 2019-11-05T08:26:43.623 回答
1

您可以使用检索 IP 地址:

@Set "IPA="&For /F Tokens^=2Delims^=^" %%A In ('^""%__AppDir__%wbem\WMIC.exe"^
 NICConfig Where "IPEnabled='TRUE' And Not Description Like '%%VirtualBox%%'"^
 Get IPAddress 2^>NUL^"')Do @Set "IPA=%%A"
@If Defined IPA Echo=%IPA%&Pause>NUL
于 2019-11-05T12:16:37.043 回答