通过测试论坛中两个bat之间如何在运行时实时接受和处理参数?,我已经基本理解原理,但是:
如果我的两个bat文件内部的业务逻辑都需要设置本地为延迟扩展,然后传参和取参数就会有问题,举例来说,如下:
【1】1.bat调用2.bat
【2】2.bat返回IP地址给1.bat
【3】1.bat 再去根据业务需要加工IP处理业务(略)
---------------------------------------------------------
代码如下:
1.bat- @echo off
- setlocal enabledelayedexpansion
-
- CALL "%~dp0\2.bat" "myIP"
-
- ECHO 测试1-%myIP%
- ECHO 测试2-!myIP!
-
-
- @REM 后面的业务逻辑也需要处理for语句,所以1.bat文件也要开启【设置本地为延迟扩展】
-
-
- pause
复制代码 2.bat- @echo off
- setlocal enabledelayedexpansion
-
-
- @REM 逻辑判断一下过来的参数名称
- if "%~1"=="myIP" Call :getIP
-
-
- ::if "%~1"=="myIP" set myIP=127.0.0.1
- if "%~1"=="myIP" set myIP=%IP%
-
-
- goto :eof
-
-
- :getIP
- @REM
- @REM 中文系统一般是:本地连接
- @REM 笔记本没有以太网卡的时候,中文系统一般是:WLAN
- set "AdapterName=WLAN"
- set "FileTmp=%temp%\ipList.txt"
- ipconfig /all >"%FileTmp%"
- for /f "delims=:" %%i in ('findstr /n /c:"%AdapterName%" "%FileTmp%"') do (
- set "SkipRow=%%i"
- goto :DoSkip
- goto :eof
- )
- goto :eof
-
-
- :DoSkip
- for /f "tokens=2 delims=:(" %%i in ('more +%SkipRow% "%FileTmp%" ^| findstr /v "IPv6" ^|findstr "IP"') do (
- set "IP=%%i"
- goto :ShowResult
- goto :eof
- )
-
- :ShowResult
- REM 格式化数据(清除空格)
- set "IP=%IP: =%"
- ::endlocal
- ::goto :eof
- echo.
- echo -----------------------------------------------------------
- ECHO 当前选择的网络适配器的名称是:!AdapterName!
- ECHO 当前选择的网络适配器IP地址是:%IP%
- echo -----------------------------------------------------------
- echo.
- pause
- goto :eof
复制代码 -------------------------------------------
然后,运行1.bat
输出结果为:- 当前选择的网络适配器的名称是:WLAN
- 当前选择的网络适配器IP地址是:192.168.1.6
- 请按任意键继续. . .
- 测试1-
- 测试2-
- 请按任意键继续. . .
复制代码 -------------------------------------------
说明:2.bat是拿到了IP地址但是,返给1.bat的时候,数据没有了
------------------------------------------
我修改了2.bat的代码,将:2.bat的setlocal enabledelayedexpansion取消后,反而运行正常了,有些不太明白,因为2.bat我还要做些别的处理,需要【置本地为延迟扩展】,所以这句话还不能注释掉,所以请大神们给看一下怎么回事,谢谢啦!!!!
而且setlocal enabledelayedexpansion再win10上运行与win7上运行是否有差异啊?
我注释掉2.bat的setlocal enabledelayedexpansion这句话之后,win10是可以了,但是win7还是没有数据,晕死了!!!! |