PowerShellを使用してWindowsの環境変数を設定したり、環境変数を読み取ったり、新しい環境変数を作成したりするのは、一度トリックを知ってしまえば簡単です。この記事で学ぶトリックは、Windows 10の環境変数だけでなく、Windows 7 SP1以降のWindowsクライアント/サーバーにも適用されます。
PowerShellは、$env:
PSDrive、レジストリ、および[System.Environment]
.NETクラスなど、Windowsの環境変数との対話に多くの異なる方法を提供します。このステップバイステップの解説では、各メソッドについて学び、環境変数のスコープを理解します。
前提条件
この記事では、Windows 10のWindows PowerShell 5.1を使用します。ただし、Windows 7 SP1以降でWindows PowerShell v3より新しいバージョンを使用している場合、お使いのバージョンでもこの技術が正常に機能するはずです。
環境変数とは何ですか?
環境変数は、その名前が示すように、Windowsやアプリケーションで使用される環境に関する情報を格納します。環境変数は、Windows Explorerやメモ帳などのテキストエディタ、cmd.exeやPowerShellなどのグラフィカルなアプリケーションからアクセスできます。
環境変数を使用すると、PowerShellスクリプトやモジュールでファイルパスやユーザー名、コンピュータ名などをハードコードする必要がなくなります。
一般的な環境変数
PowerShellで環境変数を操作する方法について学習を始めると、さまざまな変数に出会うことになります。その中で、いくつかは他のものよりも便利です。以下は、一般的な環境変数とその使用法のリストです。
Variable | Usage |
---|---|
ClientName | The name of the remote computer connected via a Remote Desktop session. |
SessionName | This helps to identify if the current Windows session is regarded by the operating system as running at the console. For console sessions SessionName will be ‘Console’. Enhanced Session connections to Hyper-V Virtual Machines do not report SessionName as ‘Console’, whereas Standard Sessions do. |
ComputerName | The name of the computer. |
SystemRoot and Windir | The path to the current Windows installation. |
ProgramFiles and ProgramFiles(x86) | The default locations for x64 and x86 programs. |
ProgramW6432 | The default location for programs, avoiding 32/64 bit redirection. This variable only applies for 32 bit processes running on a 64 bit platform. This means that you can use it to identify when a 32 bit instance of PowerShell is running on a 64 bit system. |
UserDNSDomain | The Fully Qualified Domain Name of the Active Directory domain that the current user logged on to. Only present for domain logons. |
UserDomain | The NETBIOS-style name of the domain that the current user logged on to. Can be a computer name if there’s no domain. |
UserDomainRoamingProfile | The location of the central copy of the roaming profile for the user, if any. Only present for domain logons. |
UserName | The name of the currently logged on user. |
UserProfile | The location of the profile of the current user on the local computer. |
環境変数のスコープ
環境変数には3つのスコープがあります。スコープを変数の積み重ねと考えてください。これらの「レイヤー」は、Windowsの実行中のプロセスに多くの異なる環境変数を提供します。
環境変数のスコープの「階層」
これらの「レイヤー」のそれぞれは、結合または上書きされます。階層は次のように定義されます:マシン -> ユーザー -> プロセス。各スコープの変数は、親スコープに存在する場合、親の変数を上書きします。
たとえば、一般的な環境変数であるTEMP
は、Windowsのローカル一時フォルダのパスを格納します。この環境変数は次のように設定されます:
C:\WINDOWS\TEMP
in the machine scopeC:\Users\<username>\AppData\Local\Temp
in the user scopeC:\Users\<username>\AppData\Local\Temp
in the process scope.
もしユーザーのスコープにTEMP
環境変数が設定されていない場合、最終的な結果はC:\WINDOWS\TEMP
になります。
環境変数のスコープの種類
Windowsには3つの異なる環境変数のスコープがあります。
マシン
マシンスコープの環境変数は、実行中のWindowsインスタンスに関連付けられています。どのユーザーアカウントでもこれらを読み取ることができますが、設定、変更、削除は昇格した特権で行う必要があります。
ユーザー
ユーザースコープの環境変数は、現在のプロセスを実行しているユーザーに関連付けられています。同じ名前を持つマシン-スコープの変数を上書きします。
注意:Microsoftは、マシンおよびユーザーのスコープの環境変数の値が2048文字を超えないことを推奨しています。
プロセス
プロセススコープの環境変数は、マシンおよびユーザースコープ、およびWindowsが動的に作成するいくつかの変数の組み合わせです。
以下は、実行中のプロセスで利用可能な環境変数のリストです。これらの変数はすべて動的に作成されます。
ALLUSERSPROFILE
APPDATA
COMPUTERNAME
HOMEDRIVE
HOMEPATH
LOCALAPPDATA
LOGONSERVER
PROMPT
PUBLIC
SESSION
SystemDrive
SystemRoot
USERDNSDOMAIN
USERDOMAIN
USERDOMAIN_ROAMINGPROFILE
USERNAME
USERPROFILE
レジストリの環境変数
環境変数は、ユーザースコープとマシンスコープの2つのレジストリ場所に保存されます。
環境変数を管理するためにレジストリを使用しないでください
レジストリ内の変数の変更には注意が必要です。実行中のプロセスは、レジストリの変数の変更を見ることができません。プロセスは、プロセスが開始されたときに存在していたレジストリの変数と値しか見ることができません。ただし、Windowsが変更があったことを通知する場合は除きます。
直接にレジストリを変更する代わりに、.NETクラスを使用することができます。.NETの[System.Environment]
クラスを使用すると、マシンおよびユーザーのスコープの環境変数を変更し、レジストリの管理を行うことができます。–
レジストリ内の環境変数を直接変更することは可能ですが、意味がありません。.NETクラスは、よりシンプルで、Microsoftがサポートするアプローチを提供しています。この記事では、[System.Environment]
.NETクラスの使用方法について説明します。
環境変数のレジストリの場所とクエリ
I hope you’ve been convinced to not modify the registry directly but if you’d like to take a peek at what’s in there, you can find all user environment variables in the HKEY_CURRENT_USER\Environment
key. Machine-scoped environment variables are stored at HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
.
これらのキーのいずれかの内部には、REG_SZ
またはREG_EXPAND_SZ
のタイプのレジストリ値があります。REG_EXPAND_SZ
の値は、値が取得されるときに展開される環境変数を含んでいます。
これを実証するために、REG
ユーティリティを使用します。これはWindowsに含まれる小さなコマンドラインユーティリティです。
以下のように、TEMP
環境変数をクエリします。 REG
をQUERY
パラメータとともに実行して、TEMP
変数の値を取得します。
環境変数は、上記のようにパーセント記号で囲まれた形式(
%COMPUTERNAME%
)で表示されることがあります。これは、cmd.exeやバッチファイルを通じて環境変数を表示する古い方法です。PowerShellではこの形式は認識されないことを知っておいてください。
REG
ユーティリティを使用すると、レジストリ値のネイティブな値を表示することができます。値のタイプはREG_EXPAND_SZ
であり、値には%USERPROFILE%
環境変数が含まれています。
PowerShellを使用してレジストリ値を取得する場合は、以下のようにGet-Item
コマンドレットを使用することもできます。
GUIを使用してWindowsの環境変数を表示および設定
ユーザーおよびシステムの環境変数のGUIビューを表示するには、PowerShell、コマンドプロンプト、またはWindowsキー+RからSystemPropertiesAdvanced.exeを実行してシステムの詳細設定タブを表示します。以下の画像でハイライトされているEnvironmentVariablesボタンをクリックします。

以下に示すように、環境変数ダイアログでは、ユーザースコープおよびマシンスコープの環境変数を表示、作成、および変更することができます。ダイアログでは、マシンスコープの変数をシステム変数として参照していることに注意してください。

環境変数の理解ができたので、さあ、PowerShellでの管理に移りましょう!
PowerShellを使用して環境変数とやり取りするいくつかの異なる方法があります。
Env:
PSDriveおよびプロバイダ – セッションベース。環境変数の値は現在のPowerShellセッションに対してのみ設定します$env:
変数 – セッションベース。環境変数の値は現在のPowerShellセッションに対してのみ設定します[System.Environment]
.NETクラス – セッションや再起動をまたいでユーザーとシステムのスコープの環境変数を持続させることができます
Env:
PSDriveとプロバイダ
環境変数を読み取る最良の方法の1つは、PowerShellドライブ(PSドライブ)として知られるPowerShellの概念です。PSドライブを使用すると、環境変数をEnv:
ドライブを介してファイルシステムとして扱うことができます。
Env:
ドライブへの切り替え
すべてのPSドライブと同様に、Env:\TEMP
、Env:\COMPUTERNAME
などのパスを参照します。しかし、以下に示すように、キーストロークを節約するために、任意のファイルシステムドライブと同様にEnv:
ドライブに切り替えます。
Env:
ドライブでのタブ補完
ファイルシステムにアクセスするために使用するコマンド(例:Get-Item
やGet-ChildItem
)を使用して、環境変数にアクセスすることができます。
ただし、ファイルシステムの代わりにEnv:
ドライブを読み取ります。

次に、Env:
ドライブを使用して環境変数を操作するためのいくつかの例を紹介します。
Env:
を使用して環境変数の一覧を表示する
Env:
を使用してワイルドカードを使用した環境変数の一覧を表示する
Env:
を使用して環境変数の値を検索する
これらのコマンドの結果は、キー/値のペアである[System.Collections.DictionaryEntry]
.NETオブジェクトです。これらのオブジェクトは、環境変数の名前をName
プロパティに、値をValue
プロパティに保持しています。
特定の環境変数の値にアクセスするには、Get-Item
コマンドの参照を括弧で囲み、Value
プロパティを参照します。以下に示します:
特定の環境変数のみを返す場合、Select-Object
および Where-Object
のような標準のPowerShellコマンドレットを使用して、 Env:
プロバイダーによって返されるオブジェクトを選択およびフィルタリングします。
以下の例では、環境変数 COMPUTERNAME
のみが返されます。
別の方法として、 Get-Content
コマンドレットを使用します。このコマンドレットは、環境変数の値を含む [String]
オブジェクトを返します。このオブジェクトは、Name
と Value
プロパティを持つオブジェクトではなく、値のみを返すため、取り扱いが簡単です。
デモ:文字列に環境変数の値を挿入する
Get-Content
を使用すると、環境変数の値を見つけて、例えば COMPUTERNAME
環境変数をテキスト文字列に挿入することができます。
Env:
を使用して環境変数を設定(および作成)する
New-Item
コマンドレットを使用して、PowerShellで新しい環境変数を作成します。環境変数の名前を Env:\<EnvVarName>
の形式で Name
パラメーターに指定し、環境変数の値を Value
パラメーターに指定します。以下に示します。
Set-item
cmdletを使用して環境変数を設定し、存在しない場合は新しいものを作成します。以下のように、Set-Item
コマンドレットを使用すると、環境変数を作成または変更することができます。
Env:
を使用して環境変数をコピーする
場合には、環境変数の値を複製する必要がある場合があります。これは、Copy-Item
コマンドレットを使用して行うことができます。
以下の例では、COMPUTERNAME
変数の値がMYCOMPUTER
にコピーされ、既存の値が上書きされています。
Env:
を使用して環境変数を削除する
必要なくなった環境変数を削除する場合があります。環境変数は3つの方法で削除できます:
Set-Item
コマンドレットを使用して環境変数を空の値に設定する
Remove-Item
コマンドレットを使用する
Clear-Item
コマンドレットを使用する
Env:
を使用して環境変数の名前を変更する
環境変数の名前を変更する場合、Env:
プロバイダを使用して削除してから再作成する代わりに、名前を変更するオプションがあります。
Rename-Item
コマンドレットを使用して、環境変数の名前を変更し、その値を保持します。以下では、MYCOMPUTER
変数がOLDCOMPUTER
に名前が変更され、その値が保持されていることがわかります。
$Env:
変数
Env:
ドライブをマスターすることで、環境変数をファイルとして扱う方法を学びました。このセクションでは、環境変数を変数として扱う方法を紹介します。セッション中の環境変数を管理する別の方法は、PowerShell式パーサを使用することです。この機能を使用すると、$Env:
スコープを使用して環境変数にアクセスできます。
$Env:
を使用して環境変数を取得する
$Env
スコープを使用すると、以下のようにGet-Item
コマンドを使用せずに環境変数を直接参照できます。
この方法を使用すると、以下のように環境変数を文字列に挿入することが簡単になります。
$Env:
を使用して環境変数を設定または作成する
この方法を使用して環境変数を設定するのは簡単です。これにより、以下のように環境変数が存在しない場合は新しい環境変数が作成されます。
既存の値を上書きせずに、既存の値に追加するには、+=
構文を使用します。
$Env:
を使用して環境変数を削除する
この方法を使用して環境変数を削除するには、その値を空の文字列に設定するだけです。
[System.Environment]
.NET クラスを使用する
.NET クラス [System.Environment]
は、環境変数の取得および設定のためのメソッドを提供しています。これは、さまざまな環境スコープに直接アクセスし、PowerShell セッションを超えて生存する環境変数を設定するための唯一の方法です。
以下の例のすべてで、スコープが指定されていない場合、プロセススコープが仮定されます。
[System.Environment]
を使用する場合、いくつかの異なる .NET 静的クラス メソッドを使用します。静的メソッドが何であるかを理解する必要はありません。学ぶために使用するいずれのテクニックも、最初にクラス ([System.Environment]
) を参照し、その後に2つのコロン (::
)、そしてメソッドを続けることを理解する必要があります。
[System.Environment]
を使用して環境変数をリストする
特定のスコープですべての環境変数を表示したい場合は、GetEnvironmentVariables
メソッドを使用します。このメソッドは、メソッドの引数として指定されたスコープによって指定されたすべての環境変数を返します (括弧内)。
[System.Environment]
を使用して単一の環境変数を取得する
特定の環境変数を見つける必要がある場合、2つの異なる方法で行うことができます。
GetEnvironmentVariables().<変数名>
– 推奨されないGetEnvironmentVariable('<変数名>','<スコープ>')
GetEnvironmentVariables()
GetEnvironmentVariables()
メソッドを使用すると、値を参照するためにドット表記を使用します。環境変数の値を参照する際には、[System.Environment]
クラスと静的メソッドの参照を括弧で囲み、その後にドットと環境変数の名前を指定します。以下のようになります:
この方法で環境変数を参照する際には、大文字と小文字を一致させる必要があります。上記の例では、
APPDATA
変数をappdata
として参照しようとしてみてください。代わりにGetEnvironmentVariable()
を使用してください。
GetEnvironmentVariable()
GetEnvironmentVariables()
メソッドの代わりに、単一の環境変数を検索するために GetEnvironmentVariable()
を使用します。これにより、大文字小文字の問題を回避することができ、またスコープを指定することもできます。
このメソッドを使用するには、環境変数の名前とスコープをコンマで区切って指定します。
[System.Environment]
を使用して環境変数を設定する
SetEnvironmentVariable()
メソッドを使用して、指定したスコープの環境変数の値を設定するか、存在しない場合は新しい環境変数を作成します。
変数をプロセススコープに設定する際には、プロセススコープは不安定であり、ユーザーとマシンスコープの変更は永続的です。
注意: SetEnvironmentVariableメソッドを変数名または値が32767文字以上の場合に呼び出すと、例外がスローされます。
[System.Environment]を使用して環境変数を削除する
空の文字列にその値を設定することで、指定したスコープの環境変数を削除するためにSetEnvironmentVariable()メソッドを使用します。
便利なPowerShell環境変数
他のWindowsアプリケーションと同様に、PowerShellには独自の環境変数があります。知っておくと便利な環境変数は、PSExecutionPolicyPreferenceとPSModulePathです。
PSExecutionPolicyPreference
PSExecutionPolicyPreference
環境変数は現在のPowerShell実行ポリシーを保存します。セッション固有のPowerShell実行ポリシーが設定されている場合、次の方法で作成されます:
- 「Set-ExecutionPolicy」コマンドレットを「Scope」パラメータに「Process」を指定して実行する
- 「powershell.exe」実行可能ファイルを使用して新しいセッションを開始し、コマンドラインパラメータ「ExecutionPolicy」を使用してセッションのポリシーを設定する。
PSModulePath
PSModulePath
環境変数には、PowerShell がフルパスを指定しない場合にモジュールを検索するパスが含まれています。これは、標準の PATH
環境変数と同様に、個々のディレクトリパスがセミコロンで区切られた形式で構成されています。
クイックチップ:各フォルダを分割して、$env:PSModulePath.split(‘;’) を使用して各パスを個別に処理するための文字列配列を取得できます
概要
環境変数は、実行中のシステムに関する情報を取得したり、セッションと再起動間で情報を保存するための便利な方法です。Windows のデフォルトのオペレーティングシステムの環境変数を読み取り、独自の環境変数を作成するかどうかにかかわらず、PowerShell を使用してさまざまな方法でそれらを管理することができます!
さらなる情報
- about_Environment_Variables(英語)
- Microsoft ドキュメントの .NET [System.Environment] クラス(英語)
- PowerShell の文字列形式と展開文字列の学習
Source:
https://adamtheautomator.com/powershell-environment-variables/