如每個人的電腦的HOST檔案中都有一條記錄 192.168.8.56 oa.***.com的記錄,請問如何用批處理的方式将此條記錄删除?
@echo off
for /f "tokens=*" %%i in ('type "%windir%\system32\drivers\etc\hosts"') do (
for /f "tokens=1,2" %%j in ("%%i") do (
if "%%j" EQU "192.168.8.56" (
if "%%k" NEQ "oa.***.com" echo.%%i >>temp
) else echo.%%i >>temp
)
copy /y temp "%windir%\system32\drivers\etc\hosts"
del /q temp
需要為使用者增加一條hosts記錄,如何用腳本解決這個問題。
顯然,最簡單的做法是:
echo 192.168.2.2 www.domainname.com >> %SystemRoot%\system32\drivers\etc\hosts
也就是将 192.168.2.2www.domainname.com添加到hosts檔案結尾處。
這無疑帶來一個問題,多次運作這個腳本,會在hosts檔案中加入許多無用的垃圾。我們需要加入一個判斷,檢查一下記錄是否已經存在。
set stHosts=X.X.X.X www.domainname.com
FOR /F "eol=# tokens=1 delims=" %%i in (%SystemRoot%\system32\drivers\etc\hosts) do if "%stHosts%"=="%%i" exit
echo %stHosts%>> %SystemRoot%\system32\drivers\etc\hosts
set指令比較好了解,定義了一個變量,也就是我們要插入的記錄,最後不要留白格。
解釋一下這條For指令:
FOR /F "eol=# tokens=1 delims=" %%i in (%SystemRoot%\system32\drivers\etc\hosts) do
For /F 指令會讀取hosts檔案,将其分成一行行的文字,根據我們指定的規則進行拆分處理,“eol=#” 忽略過#開頭的行,“tokens=1”傳送每行第一個符号,“delims=”将分隔符集設為空(預設為空格和跳格鍵),其實是将整行記錄傳回,并指派給%%i,然後執行do 後面的指令。
for指令功能十分強大,可以輕易完成許多看似不可能用批處理完成的任務。在指令行下鍵入 for /? 可以得到完整的幫助說明還有例子。
由此我們可以得到hosts檔案中的每條記錄,接下來用if來判别一下,看看這條記錄是否為我們要添加的記錄。如果是的話表示記錄已經添加,可以直接退出腳本,什麼也不做。 if語句中 == 兩邊的變量都加了""是為了防止變量為空的情況。
最後一行添加記錄到hosts結尾。