1. 程式人生 > >批處理--工作當中獲取本機ip地址然後執行一個迴圈啟動指令碼

批處理--工作當中獲取本機ip地址然後執行一個迴圈啟動指令碼

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 ('ipconfig') 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 表示擷取掉第一個字元 !tmp_i:~0,3!表示獲取前三個字元  
            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  
            )  
        )   
    )  
)  
 
:for_break2  
rem 返回值賦值  
set "%~1=!ip_addr_local!" 
goto :exec_code  
  
:main  
call :get_local_ip ip_addr  
:exec_code  
echo local_ip=%ip_addr%  
pause
rem 迴圈從 (開始值,遞增值,最後值) 進行呼叫  
for /l %%i in (10000001,1,10000010) do start HostClientTest.exe %ip_addr%  0 %%i 192.168.12.63 30004