Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】What Is %windir%? Windows Environment Variables Explained (With a List)

2026年10月14日に「Dev.to」が公開したITニュース「What Is %windir%? Windows Environment Variables Explained (With a List)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Windowsの「環境変数」は、システムやフォルダの場所をプログラムに伝える名前付き情報だ。例えば%windir%はWindowsフォルダのパスを示す。これによりスクリプトは固定パスを使わず参照でき、開発やシステム管理を効率化する重要な仕組みだ。

ITニュース解説

Windowsのシステムを扱う上で、「環境変数」という言葉を耳にすることがあるかもしれない。特にシステムエンジニアを目指す初心者にとって、これは避けて通れない重要な概念だ。環境変数とは、Windowsが起動するすべてのプログラムに渡す、名前の付いたテキスト情報のことである。それぞれのプログラムは、「名前=値」のペアのリストとしてこの環境情報を受け取る。

環境変数には大きく分けて二つの種類がある。一つは「ユーザー変数」で、これは各ユーザー個別に設定される。もう一つは「システム変数」で、これはすべてのユーザーとシステム全体で共通に設定されるものだ。これらの変数の基本的な仕組みとして、親となるプログラムが持っている環境情報が、そこから起動される子プログラムに引き継がれる「継承」という考え方がある。例えば、スタートメニューからコマンドプロンプトを開くと、そのコマンドプロンプトはWindowsエクスプローラーから環境情報を継承する。そして、そのコマンドプロンプトからさらに別のプログラムを起動すれば、そのプログラムはコマンドプロンプトの環境情報を継承するわけだ。このため、すでに実行中のプログラムの環境変数を変更しても、その変更はリアルタイムには反映されない。新しいプログラムを起動するか、既存のプログラムを再起動する必要がある。環境変数の名前には「=」記号を含めることはできない。また、Windowsでは大文字と小文字は区別されないため、「%WINDIR%」と「%windir%」は同じ意味を持つ。ユーザーが定義できる変数の値は最大で32,767文字までという制限がある。

代表的な環境変数の一つに「%windir%」がある。これはWindowsのインストールフォルダのパスを指す変数で、通常は「C:\Windows」という値を持っている。同様に「%SystemRoot%」も同じパスを指す。なぜ二つあるのかというと、歴史的な経緯があるためだ。「%windir%」は古いDOSベースのWindowsから存在し、「%SystemRoot%」はWindows NT系列から導入された。互換性のために両方が残されており、今日でもどちらも同じWindowsフォルダを指す。よく見かける傾向としては、「%SystemRoot%」はレジストリパスやサービス設定で、「%windir%」はスクリプトや「ファイル名を指定して実行」ダイアログで使われることが多い。

「%windir%」の下には、システムにとって非常に重要なフォルダがいくつか存在する。 例えば、「%windir%\System32」には、コマンドプロンプト(cmd.exe)やメモ帳(notepad.exe)といった64ビットのコアシステムプログラムやライブラリが格納されている。「%windir%\SysWOW64」は、64ビット版Windows上で動作する32ビットシステムファイルのための場所だ。また、「%windir%\System32\drivers\etc」には「hostsファイル」があり、これはWebサイトの名前をIPアドレスに変換するために使われるファイルで、セキュリティの観点から非常に重要になることがある。かつてマルウェアがこのファイルを改ざんしてウェブサイトへのアクセスを誘導したケースもあり、このフォルダ内のファイルを変更するには管理者権限が必要だ。その他にも、一時ファイルが置かれる「%windir%\Temp」、インストールされているフォントが格納される「%windir%\Fonts」、各種ログファイルが集まる「%windir%\Logs」などがある。

他にも多くの便利な環境変数が存在する。例えば、「%SystemDrive%」はシステムがインストールされているドライブの文字(例: C:)を指し、「%ProgramFiles%」は64ビットプログラムがインストールされる「C:\Program Files」を、「%ProgramFiles(x86)%」は32ビットプログラムがインストールされる「C:\Program Files (x86)」を指す。「%USERPROFILE%」は現在ログインしているユーザーのプロファイルフォルダ(例: C:\Users\mahir)を示し、「%APPDATA%」はアプリケーションのローミング対応データフォルダ(例: C:\Users\mahir\AppData\Roaming)を、「%LOCALAPPDATA%」はローカルに保存されるアプリケーションデータフォルダ(例: C:\Users\mahir\AppData\Local)を指す。「%TEMP%」や「%TMP%」は一時ファイルが保存されるフォルダで、「%USERNAME%」は現在のユーザー名、「%COMPUTERNAME%」はPCの名前を示す。特に開発者にとって重要なのが「%PATH%」変数だ。これは、コマンドプロンプトなどでフルパスを指定せずにプログラム名を入力した際に、Windowsがそのプログラムを探しに行くフォルダのリストをセミコロン区切りで保持している。

これらの環境変数は、Windowsエクスプローラーや「ファイル名を指定して実行」ダイアログで簡単に利用できる。「Win + R」を押して「ファイル名を指定して実行」を開き、「%temp%」と入力してEnterを押すと、一時ファイルが保存されているフォルダが開く。これは、ガイドに「アプリのフォルダをAppDataから削除してください」と書かれていても、ユーザー名を知ったり、隠しフォルダを表示させたりする手間を省いて直接アクセスできるため非常に便利だ。「%temp%」の中のファイルを削除することは、一般的な安全なクリーンアップ方法の一つだ。プログラムをすべて閉じてから「%temp%」を開き、中のファイルを全て選択して削除すれば、Windowsが使用中のファイルはスキップされる。

コマンドプロンプトで環境変数の値を確認するには、「echo %変数名%」と入力する。「echo %windir%」と入力すれば「C:\Windows」のように値が表示される。すべての環境変数の一覧を見るには、「set」コマンドを使用する。特定の文字で始まる変数を検索したい場合は、「set prog」のように入力すれば、「ProgramData」、「ProgramFiles」といった変数名が表示される。もし存在しない変数を「echo」しようとすると、エラーではなく「%NOSUCHVAR%」のように変数名がそのまま表示されるため、スクリプトなどで変数名がそのまま出力された場合は、変数が正しく設定されていないか、スペルミスがある可能性を疑う必要がある。 PowerShellでは、パーセント記号ではなく「$Env:変数名」という形式で環境変数を扱う。「$Env:windir」と入力すれば、その値が表示される。PowerShellで一時的に変数を設定する場合も、現在のセッション内でのみ有効となる。

環境変数を変更する際には、その変更が一時的なものか永続的なものかに注意が必要だ。コマンドプロンプトの「set」コマンドで変数を設定すると、その変更は現在のコマンドプロンプトウィンドウとそこから起動される子プロセスにのみ適用され、ウィンドウを閉じると消えてしまう。 一方、「setx」コマンドを使うと、変数はレジストリに書き込まれ、永続的に保存される。デフォルトではユーザー変数を設定し、管理者権限で「/m」オプションを付けることでシステム変数を設定できる。しかし、「setx」にはいくつか注意点がある。まず、変更は現在のコマンドプロンプトウィンドウには反映されず、新しいウィンドウを開いて初めて有効になる。また、値が1,024文字を超えると切り捨てられてしまう。さらに、他の環境変数を参照する形で値を設定した場合(例: %PATH%に%JAVADIR%が含まれる場合)、setxは参照をその時点の値で展開して書き込んでしまうため、後から参照元の変数が変更されても反映されない。そのため、「setx PATH "%PATH%;C:\something"」のようにPATH変数に追記する際は、意図しないデータ損失や切り捨てが発生する可能性があるため、WindowsのGUIツールを使うのが最も安全な方法である。

Windows 10や11では、GUIで環境変数を編集するのが最も安全で推奨される方法だ。「Win」キーを押し、「環境変数」と入力して「システムの環境変数を編集」または「アカウントの環境変数を編集」を選択する。開いたダイアログで「環境変数」ボタンをクリックすると、上部にユーザー変数、下部にシステム変数のリストが表示される。編集したい変数を選択し、「編集」をクリックする。「Path」変数については、Windowsが自動的に各フォルダを一行ずつ表示してくれるため、長い文字列を手動で編集するよりも安全にパスの追加、削除、順序変更ができる。変更を適用するには、開いているすべてのダイアログで「OK」をクリックし、変更された値を使用するプログラムを再起動する必要がある。システム変数はレジストリの「HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment」に、ユーザー変数は「HKEY_CURRENT_USER\Environment」に保存されている。

「%PATH%」変数は、システムエンジニアや開発者にとって最も重要な環境変数の一つだ。コマンドプロンプトなどでフルパスを指定せずに「python」や「git」といったプログラム名を入力すると、Windowsはまず現在のフォルダを検索し、次に「%PATH%」にリストされているフォルダを順に検索して、最初に見つかったプログラムを実行する。この仕組みから二つの重要な点が導かれる。一つは、「『内部コマンドまたは外部コマンドとして認識されません』というエラーが出る場合、そのプログラムのフォルダがPATHに登録されていないか、PATH変更後に新しいターミナルを開いていない可能性が高い」ということだ。もう一つは「セキュリティ」だ。もし攻撃者がPATHの早い段階にあるフォルダに書き込み権限を持ち、偽の「python.exe」や「git.exe」を配置した場合、本物のプログラムではなく偽のプログラムが実行されてしまう可能性がある。そのため、ユーザーが書き込み可能なフォルダをシステムPATHに追加しないようにし、新しいPATHエントリを追加する際には注意深く確認する必要がある。どのプログラムが実行されるかを確認するには、コマンドプロンプトで「where python」のように入力すると、実行されるプログラムのパスが順に表示される。

環境変数を理解すると、セキュリティに関する多くのアドバイスがより具体的に見えてくる。 例えば、「%TEMP%」「%APPDATA%」「%LOCALAPPDATA%」といったユーザー書き込み可能なフォルダは、管理者権限なしでプログラムがファイルを書き込めるため、正規のアプリだけでなくマルウェアも利用しやすい場所だ。不審なプログラムがないかこれらのフォルダをチェックすることは、セキュリティ調査の基本的な手順の一つだ。一方、「%windir%」や「%ProgramFiles%」といった保護されたフォルダにプログラムをインストールするには管理者権限が必要となる。そのため、これらの場所にプログラムがインストールされている場合、UAC(ユーザーアカウント制御)プロンプトを通過していることになり、そのプログラムがどのようにしてシステムに侵入したかの手がかりになることがある。 また、環境変数はそのユーザーアカウントで起動されたすべてのプロセスから読み取ることが可能だ。そのため、設定情報には適しているが、パスワードなどの機密情報をシステム変数に直接保存することは避けるべきだ。共有PCやサーバーでは、各アプリケーションが必要とする最小限のアクセス権と情報のみを与えるべきである。 スクリプトを作成する際にも、ハードコードされたパスではなく環境変数を使用することが強く推奨される。例えば、「C:\Users\mahir\Desktop」といった特定のユーザー名やドライブレターを直接記述したスクリプトは、他のユーザーや別のPCでは動作しなくなってしまう。「%USERPROFILE%\Desktop」や「%SystemDrive%」のように環境変数を使用することで、スクリプトの可搬性が高まり、コードレビューの際にも意図が明確になる。

プログラミングにおいても、環境変数は設定や機密情報をソースコードから分離するために利用される。これはWindows PCだけでなく、クラウドホスティング環境でも共通のプラクティスだ。Pythonでは「os.environ.get("WINDIR")」、PHPでは「getenv('windir')」のように、それぞれの言語で環境変数を読み取る機能が提供されている。「.get()」でデフォルト値を設定したり、「getenv()」の戻り値をチェックしたりすることで、変数が設定されていない環境でもスクリプトがクラッシュするのを防ぐことができる。APIキーのような機密情報をソースコードリポジトリに含めず、環境変数として設定することは、セキュリティ上非常に重要な開発習慣だ。

関連コンテンツ

関連IT用語