最近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つの引数を渡す事が可能です。
二つの引数を指定すれば、それぞれを使ってhostsファイルに書き込みます。
引数を一つだけ指定した場合はホスト名のみの指定とみなされます。IPアドレスだけを指定する事は出来ませんのでご注意。
2.対話的に実行するモード
何も引数を渡さないとホスト名とIPアドレスを入力するよう促されます。
ホスト名については既に登録がないかどうかチェックしています。
チェックに使っているコマンドは
- TYPE
- 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
私自身は、今までこのバッチファイルを使ってましたが全然不足はありません。