1. 程式人生 > 實用技巧 >用批處理修改hosts檔案

用批處理修改hosts檔案

最近加入了微軟社群精英計劃,希望為社群出份力。過去沒寫過部落格,就把n年以前在論壇裡發的帖子翻了出來。整理一下作為部落格文章吧。

當年有個同學問到:需要為使用者增加一條hosts記錄,如何用指令碼解決這個問題。
顯然,最簡單的做法是:

  1. echo192.168.2.2www.domainname.com>>%SystemRoot%\system32\drivers\etc\hosts

也就是將 192.168.2.2 www.domainname.com 新增到hosts檔案結尾處。
這無疑帶來一個問題,多次執行這個指令碼,會在hosts檔案中加入許多無用的垃圾。我們需要加入一個判斷,檢查一下記錄是否已經存在。

  1. @echooff
  2. setstHosts=X.X.X.Xwww.domainname.com
  3. FOR/F"eol=#tokens=1delims="%%iin(%SystemRoot%\system32\drivers\etc\hosts)doif"%stHosts%"=="%%i"exit
  4. 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結尾。

使用此指令碼,需要在組策略中設為計算器啟動指令碼。注意一定要使啟動指令碼,使用者登入指令碼會因為許可權問題無法執行,許多初學者會卡在這裡。
設定的位置在: Group Policy Object Editor -> Computer Configuration -> Windows settings -> Scripts(Startup/Shutdown)

轉載於:https://blog.51cto.com/huangchao2005/289187