批處理--工作當中獲取本機ip地址然後執行一個迴圈啟動指令碼
阿新 • • 發佈:2018-12-31
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
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