0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PowerShellで環境変数を取り扱う(永続的な変更)

Posted at

PowerShellで環境変数を取り扱う(現在のコンソール) にてPowerShellの現在のコンソールで環境変数を取り扱う記事を書きました。

本記事では一時的な変更ではなく、PowerShellでの永続的な変更について記載します。

ドキュメント

about_Environment_Variables

公式ドキュメントに環境変数についての資料が用意されており、ここを確認すればOK。

永続的な変更について

環境変数に対する変更の保存

上記記事では、下記の3種類の方法に記載されています。

  • ①プロファイルでの環境変数の保存
  • ②SetEnvironmentVariable を使用した環境変数の保存
  • ③System コントロール パネル を使用した環境変数の保存

本記事では、①プロファイルでの環境変数の保存と②SetEnvironmentVariable を使用した環境変数の保存の方法について記載します。

プロファイルでの環境変数の保存

PowerShellの起動プロファイルに、現在のコンソールのときと同様な,$Env:<variable-name> = "<new-value>"の形式で書くことで、PowerShellを起動する際に毎回、環境変数を定義して永続化する方法となります。

PowerShellの起動プロファイルの場所については、変数$profileで確認できます。

image.png

ここで表示されるパスのファイルに記載すればOKです。

下記はOh My Poshで利用する環境変数POSH_GIT_ENABLEDを起動プロファイルに記載することで、PowerShellコンソールを起動する際に毎度設定している例。

image.png

SetEnvironmentVariable を使用した環境変数の保存

Environment.SetEnvironmentVariable メソッド

環境変数にはプロセススコープ、ユーザースコープ、マシンスコープといった3種類のスコープが用意されており。
ここまででの変更はすべてプロセススコープへの変更となっていました。

プロセススコープの範囲は現在のコンソールのみとなっており、コンソールが終了すると設定が消えてしまいますが、ユーザースコープとマシンスコープの設定については、現在のプロセス外部で保持されるため、現在のコンソールが終了しても、設定が永続的に保持されます。

PowerShellでユーザースコープ、マシンスコープの設定変更を行うには、.Netで用意されている SetEnvironmentVariableメソッド を利用します。

SetEnvironmentVariableメソッドでは環境変数を設定するスコープを指定する事ができ、引数に指定がない場合プロセススコープに設定されますが、引数にスコープを設定することで、ユーザースコープ、マシンスコープに永続的に環境変数を設定する事ができます。

なおマシンスコープに設定を行う際は、適切なアクセス許可がないと失敗するので、注意してください。

なお今回の例ではユーザースコープに設定変更を追加しています。

# 環境変数Fooに Bar という値 ユーザーコープに設定
[Environment]::SetEnvironmentVariable('Foo', 'Bar', 'User')

# GetEnvironmentVariablesメソッドで引数をMachineにしてユーザーコープの環境変数を取得
[Environment]::GetEnvironmentVariables('User')

image.png

上記コマンドでユーザースコープに環境変数が設定とその設定を確認できます。

ユーザースコープに追加された環境変数となるため。
一度コンソールを閉じて別のコンソールを開いた場合でも環境変数Fooが設定されており、永続化されている事を確認できるかと思います。

なおユーザースコープに設定した環境変数を削除する場合は、空文字をSetEnvironmentVariableで設定すれば削除されます。

# GetEnvironmentVariableで引数に環境変数名とスコープを指定して取得
[Environment]::GetEnvironmentVariable('Foo','User')

# ユーザースコープの環境変数Fooに空文字を設定して環境変数Fooを削除
[Environment]::SetEnvironmentVariable('Foo', '', 'User')

# GetEnvironmentVariableで引数に環境変数名とスコープを指定して取得
[Environment]::GetEnvironmentVariable('Foo','User')

image.png

総評

環境変数を永続的に変更する場合は、環境変数のプロセススコープ、ユーザースコープ、マシンスコープについて理解している必要があるかと思います。

プロファイルでの環境変数の保存 ではPowerShellコンソールを開く度にプロセススコープに環境変数を書き込み、永続化。(プロセススコープでは毎回設定が消えてしまうが、起動するたびに書いているので永続化される)

SetEnvironmentVariable については、ユーザースコープ、マシンスコープについて書き込み、ユーザスコープ、マシンスコープはプロセス外部で保存されるため設定が永続化される。

なお今回のSetEnvironmentVariableメソッドを使った方法は永続的な変更となり、既存環境設定を破壊してしまう危険もあるため。
実行前には設定内容についてはよく確認してから実行して下さい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?