Path環境変数から存在しないパスを削除する
プログラムのアンインストールをしてもシステムのPATH環境変数から自分のパスを削除しないプログラムが多い。長期間これを繰り返すとPATH環境変数に不要なゴミパスが溜まっていく。しかし、WindowsOSの機能ではチェックできない。ひとつずつ調べるのも面倒である。
そこで、「Windowsの環境変数について少し詳しく(6)~Path環境変数をリスト化してみる~」で作成したPathlist.vbsを使ってPATH環境変数の中にある不要なパスを表示するバッチファイル(checkexist.bat)を作成した。checkexist.bat の内容は次の通り。
このバッチファイルのあるパスにpathlist.vbsをコピーして次のように実行してみた。
手元にあるWindowsXPで実行してみると次のような結果になった。
システム環境変数のPATHの中で存在するものは”OK"、存在しないものは"NG"になる
NGパスだけを表示するには次のように入力する
結果は次のようになる。
ここまで来ると、環境変数の設定も自動化したい。そこでパスリストをPATH環境変数に設定するスクリプト(setpathlist.vbs)を作成した。
このスクリプトはPATH環境変数にパスリストを設定する。
たとえば、存在するパスのみをシステムの環境変数に設定したいときはコマンドプロンプトで次のようにする。
このスクリプトでは実際に環境変数を設定する前に次のメッセージボックスが表示されるので、よく確認したほうがいい。
そこで、「Windowsの環境変数について少し詳しく(6)~Path環境変数をリスト化してみる~」で作成したPathlist.vbsを使ってPATH環境変数の中にある不要なパスを表示するバッチファイル(checkexist.bat)を作成した。checkexist.bat の内容は次の通り。
@echo off
setlocal
set etype=%1
set mode=%2
if "%mode%"=="ok" call :OK_mode
if "%mode%"=="ng" call :NG_mode
if "%mode%"=="check" call :CHK_mode
goto :eof
:OK_mode
for /F "usebackq delims=;" %%i in ( `cscript //nologo pathlist.vbs %etype%` ) do (
if exist %%i echo %%i
)
goto :eof
:NG_mode
for /F "usebackq delims=;" %%i in ( `cscript //nologo pathlist.vbs %etype%` ) do (
if not exist %%i echo %%i
)
goto :eof
:CHK_mode
for /F "usebackq delims=;" %%i in ( `cscript //nologo pathlist.vbs %etype%` ) do (
if exist %%i (echo OK %%i) else (echo NG %%i)
)
goto :eof
endlocal
このバッチファイルのあるパスにpathlist.vbsをコピーして次のように実行してみた。
checkexist system check
手元にあるWindowsXPで実行してみると次のような結果になった。
OK c:\program files\imagemagick-6.2.8-q16
OK C:\Program Files\Real\RealProducer Basic 10
OK C:\WINDOWS\system32
OK C:\WINDOWS
OK C:\WINDOWS\System32\Wbem
OK C:\Program Files\Common Files\Ulead Systems\MPEG
NG C:\Program Files\Edy\Edy Viewer
NG c:\bin
NG \usr\bin
OK C:\strawberry\c\bin
OK C:\strawberry\perl\bin
OK c:\tcl\bin
NG C:\PROGRA~1\JPKI
OK C:\strawberry\c\bin
OK C:\strawberry\perl\bin
OK c:\Program Files\Log Parser 2.2
システム環境変数のPATHの中で存在するものは”OK"、存在しないものは"NG"になる
NGパスだけを表示するには次のように入力する
checkexist system ng
結果は次のようになる。
C:\Program Files\Edy\Edy Viewer
c:\bin
\usr\bin
C:\PROGRA~1\JPKI
ここまで来ると、環境変数の設定も自動化したい。そこでパスリストをPATH環境変数に設定するスクリプト(setpathlist.vbs)を作成した。
option explicit
dim aTypelist: aTypelist = array("System","User")
dim arg
set arg = WScript.Arguments
if arg.count <> 1 then
WScript.echo "コマンド引数に " & join(atypelist,",") & " のいずれかを指定してください"
WScript.quit
end if
dim p,bCorrect
bCorrect=false
for each p in ( aTypeList )
if lcase(p) = lcase(arg(0)) then
bCorrect = true
exit for
end if
next
if not bCorrect then
WScript.echo "コマンド引数に " & join(atypelist,",") & "以外は指定できません"
WScript.quit
end if
dim sType: sType = arg(0)
dim strLine,iCount,stdin
set stdin = WScript.stdin
iCount = 0
strLine = ""
do until stdin.atEndOfStream
strLine = strLine & trim(stdin.readline) & vbLf
loop
dim aPathlist
if right(strLine,1) = vbLf then strLine = left(strLine,len(strline)-1)
aPathlist = split(strLine,vbLf)
setPathList sType, aPathlist
sub setPathlist(sType,aPathlist)
dim wshell,wshEnv,vPath,msg,result
set wshell = createobject("WScript.Shell")
set wshEnv = wshell.environment(sType)
vPath = join(aPathlist,";")
msg = sType & "の環境へ下記の環境変数を設定します" & _
VbCrLf & vbCrLf & vbTab & "Path=" & vPath
result=msgbox(msg,vbOk,"実行の確認")
if result = vbOk then
wshEnv("Path") = vPath
if wshEnv("Path") = vPath Then
wscript.echo "正常に設定しました"
else
wscript.echo "設定に失敗しました"
end if
end if
end sub
このスクリプトはPATH環境変数にパスリストを設定する。
たとえば、存在するパスのみをシステムの環境変数に設定したいときはコマンドプロンプトで次のようにする。
checkexist system ok | cscript //nologo setpathlist.vbs
このスクリプトでは実際に環境変数を設定する前に次のメッセージボックスが表示されるので、よく確認したほうがいい。
この記事へのコメント