<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>原文:http://blog.csdn.net/wangxugangzy05/article/details/45044263