hostsファイルを編集する

最近hosts バッチファイルのキーワードで辿り着く人が増えてきたので、昼休みに作ってみました。

://-----------------------------------------------
:// ● hostsファイルに情報を追加するバッチファイル
://  
://  引数1 - 追加ホスト名[省略可]
://  引数2 - 追加ホストIP[省略可]
://-----------------------------------------------
@ECHO OFF

://************** ここから変数設定 **************//
:// ファイル名格納変数
SET HOSTSFILE=%windir%\system32\drivers\etc\hosts
SET BKHOSTSFILE=%TEMP%hosts_BK
SET WKHOSTSFILE=%TEMP%hosts_WK

:// [1] NEWHOSTNAME - 追加したいホスト名
SET NEWHOSTNAME=%1

:// [2] NEWHOSTIP - 追加したいホストのIP
SET NEWHOSTIP=%2

:// [3] IsUpdate - 更新か追加か判定フラグ
://  value = 0 - 追加
://  value = 1 - 更新
SET IsUpdate=0

://************** ここからメイン処理 **************//

:// ホスト名を入力[引数で未渡しの場合のみ]
:INPUTHOSTNAME
IF "%NEWHOSTNAME%"=="" (
  ECHO 追加したいホスト名を入力してください
  SET /PNEWHOSTNAME=: 
)

TYPE %HOSTSFILE% | FIND /I "%NEWHOSTNAME%"

:// エラーコードを退避
SET ERRORCODE=%ERRORLEVEL%

:// hostsファイル未登録のホストの場合
IF %ERRORCODE%==1 (
  ECHO.
  ECHO ○ hostsファイルに未登録なので新規登録対象のホストです
  ECHO.
  GOTO INPUTHOSTNAME
)

:// hostsファイル登録済のホストの場合
IF %ERRORCODE%==0 (
  ECHO.
  ECHO ● hostsファイルに既に登録されているホストです
  ECHO    既存のデータが今回の入力データで更新されます
  ECHO.

:// 現在のデータを参考に表示
  ECHO    ・現在のデータ
  TYPE %HOSTSFILE% | FIND /I "%NEWHOSTNAME%"
  ECHO.
  ECHO    更新したくない場合はctrl + cを押して処理を中止してください
  ECHO    続行する場合は何かキーを押してください
  PAUSE > NUL

:// 更新処理であることを明示
  SET IsUpdate=1
  ECHO.
  GOTO INPUTHOSTNAME
)

:// IPアドレスを入力[引数で未渡しの場合のみ]
:INPUTHOSTNAME
IF "%NEWHOSTIP%"=="" (
  ECHO 追加したいホストのIPアドレス[ipv4]を入力してください
  SET /PNEWHOSTIP=: 
)


PING %NEWHOSTIP% -n 1 | FIND /I "Reply from" > NUL
SET ERRORCODE=%ERRORLEVEL%

IF %ERRORCODE%==1 (
  PING %NEWHOSTIP% -n 1 | FIND /I "応答" > NUL
  SET ERRORCODE=%ERRORLEVEL%
)

:// 指定IPへpingが飛ばない場合
IF %ERRORCODE%==1 (
  ECHO.
  ECHO%NEWHOSTIP%からping応答がありません
  ECHO    処理を中止する場合はctrl + cを押してください
  ECHO    処理を続行する場合は何かキーを押してください
  PAUSE > NUL
  ECHO.
  GOTO CONF
)

:// 指定IPへpingが飛ぶ場合
IF %ERRORCODE%==0 (
  ECHO.
  ECHO%NEWHOSTIP%からping応答がありました
  ECHO    処理を続行します
  ECHO.
  GOTO CONF
)


:CONF
CLS
ECHO 以下の内容で処理を実施します
ECHO 誤りが無いか確認し、なければ何かキーを押してください
ECHO.
ECHO [誤りがある場合はctrl + cを押して中止してください]
ECHO.
ECHO ********************************************
ECHO ★設定内容
ECHO.
ECHO  追加ホスト名  − %NEWHOSTNAME%
ECHO  追加ホストIP − %NEWHOSTIP%
ECHO.
ECHO ********************************************
ECHO.
PAUSE > NUL

:// 現在のファイルをバックアップしておきます
ECHO 修正前のhostsファイルをバックアップ中

IF EXIST %BKHOSTSFILE% (
  DEL %BKHOSTSFILE% /F /Q
)

IF EXIST %WKHOSTSFILE% (
  DEL %WKHOSTSFILE% /F /Q
)

COPY /Y %HOSTSFILE% %BKHOSTSFILE% > NUL
ECHO.

:ExecUpdate
IF %IsUpdate%==1 (
  ECHO 更新処理実施中!!
:// 追加したら重複する行を削除
  TYPE %HOSTSFILE% | FIND /V "%NEWHOSTNAME%" > %WKHOSTSFILE%
  ECHO %NEWHOSTNAME%	%NEWHOSTIP% >> %WKHOSTSFILE%
  MOVE /Y %WKHOSTSFILE% %HOSTSFILE% > NUL
  GOTO FINISH
)

:ExecINSERT
ECHO 追加処理実施中!!
ECHO %NEWHOSTNAME%	%NEWHOSTIP% >> %HOSTSFILE%
ECHO.

:FINISH
:// 一時ファイルは削除
IF EXIST %WKHOSTSFILE% (
  DEL %WKHOSTSFILE% /F /Q
)
ECHO 処理は終了しました
ECHO [何かキーを押してください]
PAUSE > NUL


使い方は、(1)引数を指定して実行するモードと(2)対話的に実行するモードの2つがあります。


1.引数を指定して実行するモード
バッチファイル起動時に2つの引数を渡す事が可能です。

第一引数
ホスト名(名前解決したい端末の完全修飾名)
第二引数
ホストのIPアドレス(第一引数に対応するIPアドレス[IPv4])


二つの引数を指定すれば、それぞれを使ってhostsファイルに書き込みます。
引数を一つだけ指定した場合はホスト名のみの指定とみなされます。IPアドレスだけを指定する事は出来ませんのでご注意。


2.対話的に実行するモード
何も引数を渡さないとホスト名とIPアドレスを入力するよう促されます。


ホスト名については既に登録がないかどうかチェックしています。
チェックに使っているコマンドは

  1. TYPE
  2. FIND

の2つです。

TYPE
TYPEコマンドは引数を必ず一つ取り、その引数はファイル名です。
指定されたファイルの中身をそのまま標準出力に出力します。
FIND
FINDコマンドはUnix系のfindとは異なり、ファイルを探すコマンドではありません。
標準出力から渡された結果から指定された文字列を見つけて、(1)それに一致する行 or (2)一致しない行 or (3)一致する行の行数 などを取得できます。


TYPEでhostsファイルを標準出力に展開して、その結果をパイプを経由してFINDに引き渡します。
そして指定されたホスト名に一致する行があるかないかで既存データの有無をチェックしています。


また、IPアドレスについては指定されたIPアドレスpingを1回打って接続可能かどうかチェックしています。
可能であれば問題ありませんが、繋がらなければその旨表示して、それでも登録を実施するかどうか確認しています。



あとは適当に中を読んで好きに使ってください。


ちなみに。
Windows XPでは動作確認していますが、その他のOSでは確認していません。怪しい動きをしたらフィードバックしてもらえると助かります。
たぶんWindows 2000は大丈夫なはずですが、Vistaはちょっと怪しいです。


あと。
hostsファイル自体、SYSTEMアカウントかAdministratorsグループでなければ更新は出来ません。
権限のないユーザでやる場合にはこのバッチファイルをrunas経由で実行してください。



なんて、かっこつけてバッチファイルを作りましたが、hostsファイルの書式がわかる人であればこれだけでも十分です。

@NOTEPAD %windir%\system32\drivers\etc\hosts

私自身は、今までこのバッチファイルを使ってましたが全然不足はありません。