1. ホーム
  2. スクリプト・コラム
  3. 腹筋

VBSを使用してHostsファイルのワンクリック設定コードを実装する

2022-01-01 09:25:55

まず、hostsファイルへのアクセス方法ですが、Windows環境(私は32bitのWin7を使用しています)では、コンピューターの場所のhostsファイルでは、%windir%⇄System32⇄drivers⇄ディレクトリで、ファイル名はhosts、拡張子はなしです。しかし、毎回たくさんのディレクトリをクリックしてhostsファイルを探すのではなく、以下のbatスクリプトを実行することで、メモ帳でhostsファイルを直接開くことができます。

@echo off 
if "%1" == "h" goto begin 
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit 
:begin 

notepad %SystemRoot%/System32/drivers/etc/hosts
exit

バットスクリプトに host.bat という名前を付けて C:\WindowsSystem32 の下に置くことで、コマンドラインや Win7 のスタートメニューから host コマンドを入力して直接 hosts ファイルを開くことができるようになりました。

話を元に戻して、hostsファイルの後ろに自動的にレコードを挿入する方法について説明します。

最も単純なhostsの設定、つまりhostsファイルの末尾にレコードを追加する場合は、以下のbatスクリプトで十分です。

@attrib -r "%windir%\System32\drivers\etc\hosts" 
@echo ###### Host configuration START >>"%windir%\System32\drivers\etc\hosts"  
@echo 127.0.0.1 www.tsybius2014.com >>"%windir%\System32\drivers\etc\hosts"  
@echo 127.0.0.1 www.tsybius2014.net >>"%windir%\System32\drivers\etc\hosts" 
@echo ###### Host configuration END >>"%windir%\System32\drivers\etc\hosts"  
::@attrib +r "%windir%\System32\drivers\etc\hosts"

設定は以下のように動作します。

この方法は非常にシンプルですが、繰り返し設定できるマッピングレコードがあるという点でデメリットがあります。

そこで、指定したURLのホストを自動的に設定するVBSスクリプトHostHelper.vbsを以下のように記述して再チャレンジしてみました。

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' HostHelper Hosts file configuration tool
' Author: Tsybius2014
' Date: October 20, 2015
' Description: HostHelper is a Host file configuration tool, input as Host file address, IP address, domain name
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' Force explicit declaration of all variables in the module
Option Explicit

' Read parameters
Dim strHostAddr 'Host file address
Dim strIpAddr 'IP address
Dim strName 'Host name
Dim strOper 'Operation type cover: write append: append
If WScript.Arguments.Count <> 4 Then
  WScript.Echo "Arguments error"
  WScript.Quit
Else 
  'Read in the parameters
  strHostAddr = WScript.Arguments(0) 'Parameter 1: Host file address
  strIpAddr = WScript.Arguments(1) 'Parameter 2: IP address
  strName = WScript.Arguments(2) 'Parameter 3: Host name
  strOper = WScript.Arguments(3) 'Argument 4: write policy cover: override append: append
  'overwrite: exclusive append
  'append: add IP address and hostname correspondence at the end of the file
  'Determine the write policy
  Dim strOperName
  If strOper = "cover" Then 
    strOperName = "cover"
  ElseIf strOper = "append" Then
    strOperName = "append"
  Else
    WScript.Echo "Illegal write policy! "
    WScript.Quit
  End If
  'Show input information
  WScript.Echo "Host file address:" & strHostAddr
  WScript.Echo "IP address: " & strIpAddr
  WScript.Echo "Host name: " & strName
  WScript.Echo "Write Policy: " & strOperName
  WScript.Echo ""
End If

Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2, ForAppending = 8

'Iterate through the Host file to determine if the specified Host value already exists
Dim file
Set file = FSO.OpenTextFile(strHostAddr)
Dim strLine
Dim bHostAlreadyExist
bHostAlreadyExist = False
Do While file.AtEndOfStream <> True
  strLine = LTrim(file.ReadLine)
  If Not Left(strLine, 1) = "#" Then
    Dim Array
    Array = Split(strLine, " ", -1, 1)
    If UBound(Array) >= 1 Then
      'The IP is the same and the domain name is the same, then the Host to be configured already exists
      If Array(0) = strIpAddr And Array(1) = strName Then
        bHostAlreadyExist = True
        Exit Do
      End If
    Else 
    End If 
    Echo strLine
  Else 
  End If
Loop
Close

If bHostAlreadyExist Then
  WScript.Echo "The Host you want to configure already exists! "
  WScript.Quit
End If 

'Write the correspondence between IP address and domain name to Host
If strOper = "cover" Then

  'Write strategy: overwrite
  Dim fileRead
  Set fileRead = FSO.OpenTextFile(strHostAddr)
  Dim strContent
  strContent = fileRead.ReadAll()
  fileRead.Close
  Dim ArrayLine
  ArrayLine = Split(strContent, vbCrlf, -1, 1)
  Dim i
  Dim strArrayEachLine
  For i = 0 To UBound(ArrayLine)
    ArrayLine(i) = Trim(ArrayLine(i))
    If Not Left(ArrayLine(i), 1) = "#" Then
      strArrayEachLine = Split(ArrayLine(i), " ", -1, 1)
      If UBound(strArrayEachLine) >= 1 Then
        If strArrayEachLine(1) = strName Then
          ArrayLine(i) = "#" & ArrayLine(i)
        End If
      End If
    End If
  Next
  strContent = Join(ArrayLine, vbCrlf)
  strContent = strContent & vbCrlf & strIpAddr & " " & strName
  Dim fileCover
  Set fileCover = FSO.OpenTextFile(strHostAddr, ForWriting, False)
  Write strContent
  fileCover.Close
  WScript.Echo "Overwrite finished"
  
ElseIf strOper = "append" Then

  'Write strategy: append
  Dim fileAppend
  Set fileAppend = FSO.OpenTextFile(strHostAddr, ForAppending, False)
  fileAppend.WriteLine
  WriteLine strIpAddr & " " & strName
  WScript.Echo "Appending complete"
  fileAppend.Close

End If

このVBSスクリプトの機能は、hostsファイルのアドレス、IPアドレス、ホスト名を渡し、書き込みポリシー(上書き、追記を含む)を指定し、スクリプト実行時に自動的にhostsファイルを構成することである。

このVBSスクリプトをより良く実行するために、batバッチコマンドラインを書き、以下のコードを実行しました。

@echo Tsybius 2015/10/20

set hostIPAddr=127.0.0.1
set hostName=www.tsybius2014.com
set vbsAddr=HostHelper.vbs
set hostAddr=%windir%\System32\drivers\etc\hosts

if not exist %hostAddr% echo "Host Not Found"
if not exist %hostAddr% exit
if exist %cd%\hosts.bak del %cd%\hosts.bak
copy %hostAddr% %cd%\hosts.bak

@attrib -r %hostAddr%
cscript %vbsaddr% %hostAddr% hostIPAddr hostName append
::@attrib +r %hostAddr%

@pause

このスクリプトは、ドメイン名がwww.tsybius2014.com、IPが127.0.0.1、書き込みポリシーがappend、書き込み前にhostsファイルのバックアップをとって、hostsファイルの末尾にレコードを追加しようとするものである。

このスクリプトは、以下のように実行されます。

hosts ファイルを見ると、hosts.txt の末尾にマッピングが書かれていることがわかります。

注:この記事のコードは簡単にテストしただけなので、コードの中には十分な堅牢性を備えていないものもあり、実際の使用には注意が必要です。