<pre name="code" class="cpp"><span style="font-size:18px;">goto :main rem +++++++获取本机ip++++++++++++++++++++++++++++++++++++ :get_local_ip rem 注意 不要照搬某些人的文章,如果你把函数写成setlocal dosomething endlocal 这种结构,那么在这段代码中返回值无法赋值,你得到的返回ip为"" @echo off echo 开始获取本机ip.................... for /f "delims=:" %%i in ('ipconfig ^| findstr /N "本地连接"') do ( set /a op_line=%%i goto :for_break1 ) :for_break1 set ip_addr="" set /a op_num=%op_line% rem 启用延迟变量扩展 启用后 for里面一定要用双!不要用双%啊 这是我发现很多讲延迟扩展的文章都没说的,我看了他们的文章根本不行,必须用! 自己血的试验结果,你问我为何?鬼知道这该死的批处理语法。。。 setlocal enabledelayedexpansion rem skip=%op_line%表示跳过前面%op_line%行,直接从%op_line%+1行开始处理 delims=表示读取文件时是按照那个字符来分割行的,这里默认使用换行符,也可以比如delims=+表示每次碰到+号时就作为一行交给for内部代码处理 for /f "skip=%op_line% delims=" %%i in (1.tmp) do ( rem 数字操作 用 /a的set set /a op_num+=1 rem 这里 op_line可以用%或者!围起来都行,因为它本身没有被改变的逻辑 因为%表示不延迟扩展,那么该变量在for之前就已经获得了 for的整个代码块被认为是一条代码,那么用%的变量会在for之前被替换上for之前的值,这样for内部就好像成了常量一般,无法改变for之前定义的变量 if !op_num! gtr %op_line% ( set tmp_i=%%i echo !tmp_i! | findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" rem 发现该行为地址行 if "!errorlevel!" == "0" ( :loop_search_addr_pos rem 表示<span style="color:#ff0000;">截</span>取掉第一个字符 !tmp_i:~0,3!表示<span style="background-color: rgb(255, 0, 0);">获</span>取前三个字符 set tmp_i=!tmp_i:~1! echo !tmp_i! | findstr "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9]*[0-9]" >null if !errorlevel! equ 0 ( set ip_addr_local=!tmp_i! goto :for_break2 ) else ( goto :loop_search_addr_pos ) ) ) ) setlocal disableextensions :for_break2</span> rem 返回值赋值 set "%~1=%ip_addr_local%" goto :exec_code :main call :get_local_ip ip_addr :exec_code echo local_ip=%ip_addr% pause</span> rem 循环从 (开始值,递增值,最后值) 进行调用 for /l %%i in (10000001,1,10000010) do start HostClientTest.exe %ip_addr% 0 %%i 192.168.12.63 30004</span>
时间: 2024-11-07 06:14:57