いくつかの理由により,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を設定しても,最大長以降は切り捨てられちゃう。
環境変数の管理は,名前=値というようにして管理(環境変数ブロック)されている。コマンドプロンプトで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文字。)
環境変数を設定するには,コマンドプロンプトだと,
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文字を超えちゃったら,同様に設定出来ない。環境変数を展開してメモリに設定するから。
環境変数は親プロセスからコピーされる。最初のプロセスの環境変数はどこで設定されるかというと,これには以下の2つの初期値が用意されている。
各ユーザーの環境変数には,これら2つの初期値を合成したものがそのプロセスの環境編集に設定される。
ユーザーがシステムにログインすると,まずシステム環境変数がユーザーのルートとなるプロセスに設定される。その後,ユーザー環境変数の値が設定される。
この時,環境変数PATHは特別な処理が行われて,最初にシステム環境変数PATHが設定され,ユーザー環境変数のPATHが;で区切って追加される。
これにより,ユーザーごとの独自のコマンドのパスも追加出来るようになっている。
システム環境変数とユーザー環境変数の初期値は,システムのプロパティやsetxコマンドを使って設定することができる。
注意することとして,setxコマンドでは,変数の値として最大1024文字までしか設定できない。
環境変数の初期値は,システムのプロパティで確認,設定できる。(コンピューターを右クリックまたは,コントロールパネルのシステム)
ここでの環境変数の設定は,最大でも2047文字の制限がある。このため,システムの初期値として設定できるPATHは,システム環境変数PATHの約2000文字とユーザー環境変数PATHの約2000文字を加えた,約4000文字までとなる。
しかし,環境変数の値をセットするときに,「C:\MyProgram;D:\MyTools」のようなフルパスを記述するだけでなく,「%myprg%;%mytool%」のようにした場合は,結果的には約2000文字以上の環境変数にすることは出来る。(展開される結果の文字列の最大は8190文字)
setコマンドで環境変数PATHを設定する
setコマンドを使うと,コマンドプロンプト上から,またはバッチファイルやその他スクリプトの中から環境変数を変更出来る。
変更された環境変数は,今開いているコマンドプロンプトやそこから起動するプログラムのみになる。
> set PATH=%PATH%;C:\HogeHoge
> set PATH=C:\HogeHoge;%PATH%
> set PATH=C:\HogeHoge;C:\fuga;...
setxコマンドで環境変数PATHを設定する
setxは環境変数の初期値であるシステム環境変数とユーザー環境変数を,コマンドプロンプトやバッチファイルから書き換えるときに使用します。
コンピューターを右クリックまたはコントロールパネルのシステムからの変更と出来ることは変わりません。
上記のように環境変数PATHがうまく意図したように設定されないとうまく実行できないような問題がでる。
そこで,出来るだけ環境変数PATHは短くなるようにケアすることが必要になる。
> mklink /d P "C:\Program Files" > mklink /d Q "C:\Program Files(x86)"
新しくコメントをつける