Windowsの環境変数のサイズやPATHの長さ制限について anchor.png

いくつかの理由により,Windowsで利用できる環境変数のサイズやPATHの長さには制限がある。

コマンドプロンプトなんかでコマンドを実行する場合,入力されたコマンド名がフルパス名で指定されていなければ,環境変数PATHで指定されている場所から検索されて,実行される。

WindowsをPCにインストールした直後の環境変数PATHには,%SystemRoot%以下のいくつかの場所しか登録されてないので,非常に短い。
以下は,Windows10 Proをインストールした直後の環境変数PATH。

PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\

この後,多くのアプリケーションをインストールしたり,システム更新などを繰り返したりしていると,実行ファイルや関連するデータファイルなどがさまざまな場所に配置されていく。結果として環境変数PATHやそれ以外の環境変数を追加されて行く。

Windowsの環境変数にはサイズの制限があって,これが問題になることがある。

よくある問題は,環境変数PATHが長くなりすぎてしまって,勝手にPATHがちょん切れてその結果コマンドが実行できない,という問題。
Windowsのバージョンにもよるが,大体のWindowsは環境変数PATHの最大長は約2000文字になっている。
これを超えるような環境変数PATHを設定しても,最大長以降は切り捨てられちゃう。

Page Top

環境変数のサイズ制限 anchor.png

環境変数の管理は,名前=値というようにして管理(環境変数ブロック)されている。コマンドプロンプトでsetコマンドで,その一覧が表示される。

D:\home\ueno> set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\user01\AppData\Roaming
 :
 :
USERPROFILE=C:\Users\yueno
windir=C:\Windows
 :
 :

これらの環境変数は,Windowsのプロセス毎にメモリにセットされていて,その初期値は親プロセスの環境変数を全てコピーしたもの。
子プロセスで環境変数の内容を変更しても,それは親プロセスの環境変数は変化しない。

この環境変数のサイズは,1つの変数当たり最大32767文字(これはUnicodeなので,バイト数だと最大64Kbytesまで)になっている。
また全ての環境変数を合計したサイズ(環境変数ブロックの最大サイズ)は,現在の利用可能なメモリで制限される。(Windows XPなんかだと,総サイズ=32767文字。)

Page Top

コマンドプロンプトの入力行は8190文字まで anchor.png

環境変数を設定するには,コマンドプロンプトだと,

D:\home\ueno> set var1=C:\Windows

のようにして設定する。だが,コマンドプロンプトだと1行当たり最大で8190文字(Windows 2000やNT 4.0だと2046文字)入力になるので,これを超えるような長い設定は出来ないことになる。
コマンドプロンプトで設定する時は,set<変数名>=も必要なので,値としての最大は約8180文字程度になる。

別の環境変数を参照して,

D:\home\ueno> set var=%longvar1%;%longvar2%;%longvar3%

のようにした場合で8000文字を超えちゃったら,同様に設定出来ない。環境変数を展開してメモリに設定するから。

Page Top

システム環境変数やユーザー環境変数の最大値は約2000文字 anchor.png

環境変数は親プロセスからコピーされる。最初のプロセスの環境変数はどこで設定されるかというと,これには以下の2つの初期値が用意されている。

  • システム環境変数
    システム全体で使われる共通の環境変数。
    そのPCの全ユーザーで共通。
    実際の環境変数の設定は,レジストリのHKEY_LOCAL_MACHINEの\SYSTEM\CurrentControlSet\Control\Session Manager\Environmentに格納されている。
  • ユーザー環境変数 PCにユーザーがログオンするたびに設定される環境変数。
    ユーザーごとに固有。
    最初にシステム環境が設定され,その後,追加でユーザー環境変数の値が設定される。
    実際の環境変数の設定は,レジストリのHKEY_CURRENT_USERの\Environmentに格納されている。

各ユーザーの環境変数には,これら2つの初期値を合成したものがそのプロセスの環境編集に設定される。
ユーザーがシステムにログインすると,まずシステム環境変数がユーザーのルートとなるプロセスに設定される。その後,ユーザー環境変数の値が設定される。

この時,環境変数PATHは特別な処理が行われて,最初にシステム環境変数PATHが設定され,ユーザー環境変数のPATHが;で区切って追加される。
これにより,ユーザーごとの独自のコマンドのパスも追加出来るようになっている。

システム環境変数とユーザー環境変数の初期値は,システムのプロパティやsetxコマンドを使って設定することができる。
注意することとして,setxコマンドでは,変数の値として最大1024文字までしか設定できない。

Page Top

環境変数の設定 anchor.png

環境変数の初期値は,システムのプロパティで確認,設定できる。(コンピューターを右クリックまたは,コントロールパネルのシステム)
ここでの環境変数の設定は,最大でも2047文字の制限がある。このため,システムの初期値として設定できるPATHは,システム環境変数PATHの約2000文字とユーザー環境変数PATHの約2000文字を加えた,約4000文字までとなる。
しかし,環境変数の値をセットするときに,「C:\MyProgram;D:\MyTools」のようなフルパスを記述するだけでなく,「%myprg%;%mytool%」のようにした場合は,結果的には約2000文字以上の環境変数にすることは出来る。(展開される結果の文字列の最大は8190文字)

setコマンドで環境変数PATHを設定する
setコマンドを使うと,コマンドプロンプト上から,またはバッチファイルやその他スクリプトの中から環境変数を変更出来る。
変更された環境変数は,今開いているコマンドプロンプトやそこから起動するプログラムのみになる。

  • 末尾に追加
    > set PATH=%PATH%;C:\HogeHoge
    環境変数PATHの値を,現在のPATH + C:\HogeHoge にする場合。
  • 先頭に追加
    > set PATH=C:\HogeHoge;%PATH%
    環境変数PATHの値を,C:\HogeHoge + 現在のPATH にする場合。
  • 全体の定義
    > set PATH=C:\HogeHoge;C:\fuga;...
    これは,現在のPATHを破棄して,全てを設定し直す場合。

setxコマンドで環境変数PATHを設定する
setxは環境変数の初期値であるシステム環境変数とユーザー環境変数を,コマンドプロンプトやバッチファイルから書き換えるときに使用します。
コンピューターを右クリックまたはコントロールパネルのシステムからの変更と出来ることは変わりません。

Page Top

システム環境変数とユーザー環境変数で同じ名前があった場合 anchor.png

もしシステム環境変数とユーザー環境変数に同じ名前の変数があった場合(PATH以外),ユーザー環境変数で上書き設定される。

Page Top

環境変数PATHの工夫 anchor.png

上記のように環境変数PATHがうまく意図したように設定されないとうまく実行できないような問題がでる。

そこで,出来るだけ環境変数PATHは短くなるようにケアすることが必要になる。

  • 重複の排除や内容の整理
    PATHを短くする方法としては,まず,PATHの内容を確認して,不要なものを排除したり,同じものは削除したりする。
    なんかのインストーラーの不具合から,時々同じ物がPATHに複数設定されていることがある。
  • 8.3形式の名前を使う
    例えば,「C:\Program Files」や「Program Files (x86)」の代わりに,「C:\PROGRA~1」や「C:\PROGRA~2」のような,8.3形式の短い名前をパスに使用するという方法がある。
    まあ,少ししか効果は無いかもしれないが・・・
    8.3形式の名前を調べるには,コマンドプロンプトでdir /xで確認できる。
  • mklinkコマンドを使う
    Windows 7にはmklinkコマンドがあって,長いPATHを短いPATHで代替えすることが出来ます。
    > mklink /d P "C:\Program Files"
    > mklink /d Q "C:\Program Files(x86)"
    のようにして,PやQを長いPATHの代わりとして使う。
  • なるべく1カ所にまとめる PATHが長くなる原因として,さまざまなコマンドが数多くのフォルダーに分散していることがある。
    1カ所にできるだけまとめると,それを設定するだけで良いため,全体に短くすることが出来る。 私は,C:\WinApl\exe にこのようなコマンドをまとめています。

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

Front page   Freeze Diff Backup Copy Rename Reload   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom)
Counter: 2886, today: 1, yesterday: 8
Last-modified: 2020-12-26 (Sat) 16:07:50 (JST) (816d) by yuji