你們都知道,批處理中運行的都是一步步單進程執行, 但若是進程執行比較慢,如PING一個不通的IP地址,那就會大大影響批處理程序的執行效率。
以下內容將簡單舉例,在WINDOWS下使用批處理作多進程併發,以達到「多線程」的效果。
例:須要PING 192.168.0.1到192.168.0.254的全部IP地址,並將是否能PING通的結果輸出到log.txt
實現以下:
rem 主程序.bat,只需一行代碼,調用checkip.bat,經測試,CPU2.6G MEM1G可併發40個左右的進程
for /l %%i in (1,1,254) do (start /min cmd /c checkip.bat 192.168.0.%%i) 多線程
rem checkip.bat內容以下:
ping %1 -n 1
if %errorlevel%==0 (echo %1 alive>>log.txt) else (echo %1 dead>>log.txt)併發
出處:http://www.jb51.net/article/8467.htm
====================================================================================測試
根據以上資料,我本身進行了修改,只須要一個主程序就能執行代碼:
程序進化
@echo off
if "%1"=="" (for /l %%a in (1,1,100) do (start /min cmd /c %0 10.120.6.%%a&ping 127.0.0.1 -n 1>nul))
if not "%1"=="" (ping -a %1 -n 1|find "reply" /i&&echo alive %1>>LogIP.txt||echo dead %1>>LogIP.txt).net
爲了使代碼過長,方便閱讀,我分紅了兩行,其實一行就能夠完成的。你能夠本身修改,直接在cmd窗口運行的語句,若是你寫不出來,能夠再來問我。
程序知識點說明:
1.判斷參數是否爲空
2.使用start命令,請注意和goto和call的區別
3.使用ping作延遲
4.使用find命令判斷IP是否開機狀態並記錄到日誌中
5.提示信息禁止輸出。線程
程序再進化
爲了每次執行後清空日誌文件,修改代碼以下:
@echo off
if "%1"=="" (
if exist "logip.txt" del LogIp.txt
for /l %%a in (1,1,100) do (start /min cmd /c %0 10.120.6.%%a&ping 127.0.0.1 -n 1 1>nul))
if not "%1"=="" (ping -a %1 -n 1|find "reply" /i&&echo alive %1>>LogIP.txt||echo dead %1>>LogIP.txt)
固然,若是你想使用兩個bat文件,能夠直接把兩行代碼分別寫在兩個文件中,每一個文件寫一行也能夠。
說明:
1.在for語句的最後,有ping 127.0.0.1 -n 1 1>nul,-n 1表示ping1次,後面的1>nul表示正常信息重定向禁止輸出,具體博客內容其餘文章句柄重定向。
2.語句if exist "logip.txt" del LogIp.txt能夠使用 echo [%date% %time%]>LogIp.txt 來代替,它們兩句的做用是相同的,具體使用就看我的用法了
以上是本身的一些心得,怕本身忘記,記錄在此。
轉發請註明出處。日誌