bat腳本—2

實現功能:在C:\Windows\System32\drivers\etc目錄下的hosts文件中添加myComputer節點的值

 

實現思路:1.直接讀取hosts文件,如果匹配到myComputer節點的值,就不加,否則在文件最後添加一行形如127.0.0.1 myComputer的內容,這種方式的侷限在於無法驗證ip地址的有效性;
          2.直接在命令行ping,根據ping的結果決定後續處理。

 

要點:1.獲取命令執行後的返回值。返回值放在errorlevel變量中,返回值爲0表示正常執行完成,errorlevel的取值範圍是0~255。
      2.變量延遲。批處理腳本中,變量延遲默認是不開啓的,所以我們在for和if中對變量值進行的修改,是無法立即生效的,需要開啓變量延遲,並且變量用"!"代替之前的"%"。
      3.將cmd命令執行後的結果賦值給變量。linux系統下,這個操作很簡單,直接用"="賦值就好了,但是在windows系統下麻煩點,需要用for給變量賦值。

 

代碼:
注:在有些(如win10)系統下,需要以管理員權限運行此腳本


@echo off
::開啓變量延遲
setlocal EnableDelayedExpansion

set hostName=myComputer
set ipAdress=127.0.0.1
set hostsPath=C:\Windows\System32\drivers\etc
set hostsFile=%hostsPath%\hosts
set fileName=hosts
set tmpFile=%hostsPath%\hosts.tmp
set flagName=32

:start
::在命令行執行ping,獲取返回值
ping %hostName% -n 1

::執行成功,說明hosts中有對應的節點信息
if %errorlevel% EQU 0 (goto end)
::執行失敗的原因有可能是hosts中沒有對應的節點,也有可能是對應節點的ip地址無效
if %errorlevel% EQU 1 (goto addOrModify)

goto end

:addOrModify
echo ---addOrModify---
::如果是對應的節點ip地址無效,命令行的返回結果中會有"32"的字符串,其它字符串除"Ping"外都會受到操作系統語言的影響;但是hosts文件中沒有對應節點也會有"Ping"這個字符串
set flag=0
for /f %%i in ('ping %hostName% -n 1 ^| find /c "%flagName%"') do (
    set flag=%%i
)
::如果含有"32"這個字符串,說明對應的ip地址無法ping通,需要修改
if %flag% GTR 0 (goto modifyAdress) else (goto addAdress)

::校驗修改後是否生效
goto start


:modifyAdress
echo ---modifyAdress---
::查找到相應的節點後,將其修改
for /f "delims=" %%i in (%hostsFile%) do (
    set hasHostNameFlag=0
    for /f %%j in ('echo %%i ^| find /c "%hostName%"') do (
        set hasHostNameFlag=%%j
    )
    
    if !hasHostNameFlag! EQU 0 (echo %%i) else (echo     %ipAdress%       %hostName%)
)>>%tmpFile%
del %hostsFile% /q
ren %tmpFile% %fileName%

::校驗修改後是否生效
goto start

:addAdress
echo ---addAdress---

::如果沒有對應的節點,直接在文件末尾追加
echo     %ipAdress%       %hostName%>>%hostsFile%

::校驗修改後是否生效
goto start


:end
echo ----------end----------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章