ハードなソフトの話

アクセスカウンタ

zoom RSS Windowsの環境変数について少し詳しく(6)〜Path環境変数をリスト化してみる〜

<<   作成日時 : 2009/08/04 23:02   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

環境変数は基本的にシステム環境変数とユーザー環境変数で定義されている場合、ユーザー環境変数定義されたものがプロセス環境変数に適用される。
たとえば、次のように定義されている場合:
システム環境変数 TEMP=C:\Windows\TEMP
ユーザー環境変数 TEMP=C:\%USERPROFILE%\AppData\Local\Temp

プロセス環境変数は次の値になる
TEMP=C:\%USERPROFILE%\AppData\Local\Temp
(実際には展開されていますが…)

しかし、Path変数だけは違う。システム環境変数の定義とユーザー環境変数の定義を組み合わせた内容がプロセス環境変数適用される。
システム環境変数 Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
ユーザー環境変数 Path=c:\Tcl\bin
プロセス環境変数 Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;c:\Tcl\bin

Pathが少ないときは、これでもいいが、長くなると状況が把握しにくい。そこで次のスクリプト(Pathlist.vbs)を書いてみた。
option explicit

dim aTypelist
aTypelist = array("System","User","Process")
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 sEnvType,ePath,sSys,sUsr
dim aPathlist,aSysPathlist,aUsrPathlist
sEnvType = arg(0)
select case(lcase(sEnvType))
case "system", "user"
    aPathlist = getPathlist(sEnvType)
    for each ePath in aPathlist
        Wscript.echo ePath
    next
case "process"
    aPathlist = getPathlist(sEnvType)
    aSysPathlist  = getPathlist("System")
    aUsrPathlist  = getPathlist("User")
    for each ePath in aPathlist
        sSys = "-" : if findPath(aSysPathlist,ePath) >= 0 then sSys="S"
        sUsr = "-" : if findPath(aUsrPathlist,ePath) >= 0 then sUsr="U"
        Wscript.echo sSys & sUsr & " " & ePath
    next
end select

function findPath(aPathList,strFind)
    dim i,result
    result = -1
    for i = lbound(aPathlist) to ubound(aPathlist)
        if lcase(aPathList(i)) = lcase(strFind) then
            result = i
            exit for
        end if
    next
    findPath = result
end function

function getPathlist(sType)
    dim wshell,wshEnv
    set wshell = createobject("WScript.Shell")
    set wshEnv = wshell.environment(sType)

    dim aPathlist,ePath
    aPathlist = split(wshEnv("path"),";")
    getPathlist = aPathList
end function

このスクリプトはPath変数の中にあるセミコロン(;)を改行に変換して縦に表示する。
たとえば、前述のシステム環境変数を表示したい場合コマンドラインから次のように入力する
cscript //nologo envlist.vbs system

出力結果は次のようになる。
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem

ただし、次のようにコマンドラインからプロセス環境変数を指定すると
cscript //nologo envlist.vbs process

次のように出力する。
S- C:\Windows\system32
S- C:\Windows
S- C:\Windows\System32\Wbem
-U C:\Tcl\bin

Sはシステム環境変数で定義していること、Uはユーザー環境変数で定義していることを示す。
両方で定義されている時はSUと表示される。
たとえば、インストールプログラムによってユーザー環境変数が次のように定義されているとする。
c:\Tcl\bin;c:\Windows\System32

この場合、次のように表示される。
SU C:\Windows\system32
S- C:\Windows
S- C:\Windows\System32\Wbem
-U C:\Tcl\bin
SU C:\Windows\system32

実はインストーラによってはこのようにシステムとユーザーの両方の環境変数を設定するものがある。
状況さえ把握していれば SU になっているパスはユーザー環境変数から削除するのもいいかもしれない。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
Path環境変数から存在しないパスを削除する
プログラムのアンインストールをしてもシステムのPATH環境変数から自分のパスを削除しないプログラムが多い。長期間これを繰り返すとPATH環境変数に不要なゴミパスが溜まっていく。しかし、WindowsOSの機能ではチェックできない。ひとつずつ調べるのも面倒である。 そこで、「Windowsの環境変数について少し詳しく(6)〜Path環境変数をリスト化してみる〜」で作成したPathlist.vbsを使ってPATH環境変数の中にある不要なパスを表示するバッチファイル(checkexist.ba... ...続きを見る
ハードなソフトの話
2009/08/06 23:39

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
Windowsの環境変数について少し詳しく(6)〜Path環境変数をリスト化してみる〜  ハードなソフトの話/BIGLOBEウェブリブログ
文字サイズ:       閉じる