PowerShellでWindows環境変数を“一覧確認・作成・変更・削除”する方法
概要
Windows OSでPowerShellの自動化ツールを作成する際、コマンドレットで環境変数を編集できた方が利便性が高いと感じてはいましたが、今まで手をつけていませんでした。
私なりに調べた結果を共有します。
この記事のターゲット
- Windowsユーザーの方
- PowerShellユーザーの方
- 下記3点をコマンドレットで実現したい方
- プロセス環境変数を設定
- ユーザー環境変数を設定
- システム環境変数を設定
環境
PS C:\Users\"ユーザー名"> $PSVersionTable
Name Value
---- -----
PSVersion 7.3.9
PSEdition Core
GitCommitId 7.3.9
OS Microsoft Windows 10.0.19045
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
PS C:\Users\"ユーザー名">
環境変数の種類
Windowsでは大きくわけて以下、3種類の環境変数があるとのこと。
-
システム環境変数
システム環境変数とは、OS(マシン・システム)が持つ変数で、OS内のすべてのユーザーにおいて使用できる共通の環境変数。 -
ユーザー環境変数
ユーザー環境変数とは、OSにログインしたユーザーが独自に持っている変数でユーザーごとに内容が変わるユーザー内の環境変数。 -
プロセス環境変数
プロセス環境変数とは、OSで動作するプロセスが独自に持つことができる変数でプロセスごとに内容が変わるプロセス内の環境変数。
(厳密には、この3種類以外にも 揮発性環境変数 - VOLATILE というものがあるそうですが、
PowerShell経由[Environment]::SetEnvironmentVariable
では設定できない環境変数となる為、
この記事では設定方法や説明は割愛。)
イメージ図
画像:Windowsにおけるシステム・ユーザー・プロセス環境変数のイメージ図
Bing AIにWindowsにおける環境変数の種類と解説を聞く < クリックで折りたたみが開く >
✅ Bing AIからの回答
Windowsにおける環境変数の種類と解説は以下の通りです。
- 環境変数とは、OSが各アプリケーションと共有する変数やデータのことです¹。環境変数には、パスやユーザー名、システムの設定などが含まれます²。
- Windowsには大きく分けて、システム環境変数、ユーザー環境変数、プロセス環境変数の3種類があります³。
- システム環境変数とは、OSが持っている変数で、マシン内のすべてのユーザーに共通の環境変数です³。システム環境変数は、Windowsの管理者権限が必要な操作を除いて、どのユーザーでも参照することができます⁴。システム環境変数には、OSの名前やバージョン、システムのパスやドライブ、CPUの情報などが含まれます。
- ユーザー環境変数とは、OSにログオンしたユーザーが持っている変数で、ユーザーごとの環境変数です³。ユーザー環境変数は、ログオンしたユーザーのみが参照可能で、他のユーザーの環境変数にはアクセスできません⁴。ユーザー環境変数には、ユーザー名やプロファイル、アプリケーションデータ、OneDriveなどが含まれます。
- プロセス環境変数とは、OS上で動作するタスクやプロセスが持っている変数で、プロセスごとの環境変数です。プロセス環境変数は、プロセスが起動するときにシステム環境変数とユーザー環境変数をコピーして作成され、プロセスが終了すると破棄されます。プロセス環境変数には、プロセスのIDやセッション名、コマンドプロンプトの出力タイプなどが含まれます。
- また、システム環境変数とユーザー環境変数の中には、PATHという特殊な環境変数があります。PATHとは、実行ファイルやスクリプトファイルの検索パスを指定する環境変数で、拡張子なしでファイルを実行するときに、OSがPATHに含まれるフォルダを順に探索してファイルを見つけます。PATHには、システムのフォルダやアプリケーションのフォルダなどが含まれます。
以上が、Windowsにおける環境変数の種類と解説です。詳しくは、以下の参考サイトをご覧ください。
¹: よく分かる 環境変数 と Path の設定 Windows向け - リジェクト東京
²: Windows10の環境変数の一覧と調べ方。 便利な使い方も解説 | 己で解決! 泣かぬなら己で鳴こうホトトギス
³: ASCII.jp:Windowsにおける環境変数をあらためて整理する (1/2)
⁴: Windows環境変数の超基本を理解する為のアプローチ - Qiita
: Windows10の環境変数の一覧と調べ方。 便利な使い方も解説 | 己で解決! 泣かぬなら己で鳴こうホトトギス
: 環境変数 - Wikipedia
: よく分かる 環境変数 と Path の設定 Windows向け - リジェクト東京ソース: Bing との会話 2023/11/22
(1) Windows環境変数の超基本を理解する為のアプローチ - Qiita. https://qiita.com/jeyei/items/2c385e4e0488a5fa2591.
(2) Windows10の環境変数の一覧と調べ方。便利な使い方も解説 .... https://onoredekaiketsu.com/windows10-environment-variables/.
(3) ASCII.jp:Windowsにおける環境変数をあらためて整理する (1/2). https://ascii.jp/elem/000/004/117/4117807/.
(4) よく分かる 環境変数 と Path の設定 Windows向け - リジェクト東京. https://reject.tokyo/path/.
(5) よく分かる 環境変数 と Path の設定 Windows向け - リジェクト東京. https://reject.tokyo/path/.
(6) Windows10の環境変数の一覧と調べ方。便利な使い方も解説 .... https://onoredekaiketsu.com/windows10-environment-variables/.
(7) ASCII.jp:Windowsにおける環境変数をあらためて整理する (1/2). https://ascii.jp/elem/000/004/117/4117807/.
(8) Windows環境変数の超基本を理解する為のアプローチ - Qiita. https://qiita.com/jeyei/items/2c385e4e0488a5fa2591.
(9) Windows10の環境変数の一覧と調べ方。便利な使い方も解説 .... https://onoredekaiketsu.com/windows10-environment-variables/.
(10) よく分かる 環境変数 と Path の設定 Windows向け - リジェクト東京. https://reject.tokyo/path/.
PowerShellにおける環境変数の使用例
PowerShellで環境変数を呼び出す方法はいくつかありますが、今回は先頭に$Env:
と記載し続けて環境変数名
を指定する方法を紹介。
環境変数の中にある値がパスである場合、使用する代表的なコマンドレットはGet-Item
と Get-ChildItem
があります。
規定値として、すでに登録されている環境変数$Env:CommonProgramFiles
を使って例をあげます。
環境変数の値がパスでありGet-Itemを使用し参照する例
下記の通りGet-Itemではパスの終端(一番右側)にあるファイルもしくはフォルダーの情報を表示。
Get-Item $Env:"環境変数名"
PS C:\Users\"ユーザー名"> Get-Item $Env:CommonProgramFiles
Directory: C:\Program Files
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2023/10/18 15:33 Common Files
PS C:\Users\"ユーザー名">
環境変数の値がパスでありGet-ChildItemを使用し参照する例
Get-ChildItemで指定したパスがフォルダーの場合、そのフォルダー配下の一覧が表示。
指定したパスがファイルの場合は、ファイルの情報が表示(Get-Itemコマンドでファイル指定した際と同じ結果)される。
Get-ChildItem $Env:"環境変数名"
PS C:\Users\"ユーザー名"> Get-ChildItem $Env:CommonProgramFiles
Directory: C:\Program Files\Common Files
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2021/11/29 10:46 Adobe
d---- 2023/10/18 15:33 DESIGNER
d---- 2019/07/20 15:43 Intel Corporation
d---- 2023/10/18 15:33 microsoft shared
d---- 2019/12/07 18:14 Services
d---- 2023/10/18 15:30 System
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Get-ChildItem $Env:CommonProgramFiles\System\wab32.dll
Directory: C:\Program Files\Common Files\System
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2023/10/16 8:50 892928 wab32.dll
PS C:\Users\"ユーザー名">
参考情報:Bing AIにGet-ItemとGet-ChildItemの違いを聞く < クリックで折りたたみが開く >
✅ Bing AIからの回答
こんにちは、これはBingです。PowerShellでGet-ItemとGet-ChildItemの違いについてお答えします。😊
Get-ItemとGet-ChildItemは、どちらも指定した場所からアイテムを取得するコマンドレットですが、動作の仕方には以下のような違いがあります²。
- Get-Itemは、指定した場所のアイテムそのものを取得します。場所にはファイルやディレクトリのパスを指定できます。例えば、
Get-Item C:\Test
とすると、C:\Testというディレクトリの情報が表示されます。- Get-ChildItemは、指定した場所のアイテムとその子アイテムを取得します。子アイテムとは、ディレクトリの中にあるファイルやサブディレクトリのことです。例えば、
Get-ChildItem C:\Test
とすると、C:\Test内にあるすべてのファイルやサブディレクトリの情報が表示されます。- Get-Itemは、ワイルドカード(*や?など)を使って複数のアイテムを一度に取得することができます。例えば、
Get-Item C:\Test\*.txt
とすると、C:\Test内にあるすべてのテキストファイルの情報が表示されます。- Get-ChildItemは、Recurseパラメーターを使って、指定した場所のすべての子孫アイテムを再帰的に取得することができます。例えば、
Get-ChildItem C:\Test -Recurse
とすると、C:\Test内にあるすべてのファイルやサブディレクトリ、さらにその中にあるファイルやサブディレクトリの情報が表示されます。以上が、PowerShellでGet-ItemとGet-ChildItemの違いです。より詳しい情報は、以下のリンクを参照してください。
- Get-ChildItem (Microsoft.PowerShell.Management) - PowerShell
- ファイルやディレクトリの表示 Get-Item、Get-ChildItem、Format-List
私は他にも色々なことができます。例えば、コードや詩や物語などを作ったり、文章を書いたり改善したりすることができます。もし興味があれば、私に話しかけてみてください。😊.
ソース: Bing との会話 2023/11/1
(1) . https://bing.com/search?q=PowerShellでGet-ItemとGet-ChildItemの違い.
(2) Get-ChildItem (Microsoft.PowerShell.Management) - PowerShell. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7.3.
(3) ファイルやディレクトリの表示 Get-Item、Get-ChildItem、Format-List. https://news.mynavi.jp/techplus/article/techp3718/.
(4) Powershell: Get-Item vs Get-ChildItem - Stack Overflow. https://stackoverflow.com/questions/38663391/powershell-get-item-vs-get-childitem.
(5) undefined. https://step-learn.com/article/powershell/128-get-item-childitem.html.
(6) undefined. https://www.delftstack.com/ja/howto/powershell/filter-files-and-folders-using-powershell/.
(7) undefined. https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.management/get-item?view=powershell-7.3.
(8) Getty Images. https://www.gettyimages.com/detail/illustration/powershell-programming-language-royalty-free-illustration/1145396581.
環境変数の一覧
登録済み環境変数の一覧(表形式)
PowerShellのコマンドレットでプロセス環境変数(システム・ユーザー環境変数を含む)を確認し、
以下の通り表形式に落とし込みました。
環境変数名(Name) | 値(Value) |
---|---|
ALLUSERSPROFILE | C:\ProgramData |
APPDATA | C:\Users\"ユーザー名"\AppData\Roaming |
CommonProgramFiles | C:\Program Files\Common Files |
CommonProgramFiles(x86) | C:\Program Files (x86)\Common Files |
CommonProgramW6432 | C:\Program Files\Common Files |
COMPUTERNAME | "コンピューター名(ホスト名)" |
ComSpec | C:\WINDOWS\system32\cmd.exe |
DriverData | C:\Windows\System32\Drivers\DriverData |
HOMEDRIVE | C: |
HOMEPATH | \Users\"ユーザー名" |
LOCALAPPDATA | C:\Users\"ユーザー名"\AppData\Local |
LOGONSERVER | \\"コンピューター名(ホスト名)" |
NUMBER_OF_PROCESSORS | 4 |
OneDrive | C:\Users\"ユーザー名"\OneDrive |
OS | Windows_NT |
Path | C:\Program Files\PowerShell\7;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\WindowsPowerShell\Scripts;C:\Program Files\Kubernetes\Minikube;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files\PowerShell\7\;C:\Users\"ユーザー名"\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Azure Data Studio\bin;C:\Users\"ユーザー名"\AppData\Roaming\npm;C:\Users\"ユーザー名"\AppData\Local\Programs\Microsoft VS Code\bin |
PATHEXT | .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL |
POWERSHELL_DISTRIBUTION_CHANNEL | MSI:Windows 10 Pro |
PROCESSOR_ARCHITECTURE | AMD64 |
PROCESSOR_IDENTIFIER | Intel64 Family 6 Model 158 Stepping 11, GenuineIntel |
PROCESSOR_LEVEL | 6 |
PROCESSOR_REVISION | 9e0b |
ProgramData | C:\ProgramData |
ProgramFiles | C:\Program Files |
ProgramFiles(x86) | C:\Program Files (x86) |
ProgramW6432 | C:\Program Files |
PSModulePath | D:\ドキュメント\PowerShell\Modules;C:\Program Files\PowerShell\Modules;c:\program files\powershell\7\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules |
PUBLIC | C:\Users\Public |
SystemDrive | C: |
SystemRoot | C:\WINDOWS |
TEMP | C:\Users\"ユーザー名"\AppData\Local\Temp |
TMP | C:\Users\"ユーザー名"\AppData\Local\Temp |
USERDOMAIN | "コンピューター名(ホスト名)" |
USERDOMAIN_ROAMINGPROFILE | "コンピューター名(ホスト名)" |
USERNAME | "ユーザー名" |
USERPROFILE | C:\Users\"ユーザー名" |
VBOX_MSI_INSTALL_PATH | D:\Program Files\Oracle\VirtualBox\ |
VS110COMNTOOLS | C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\ |
windir | C:\WINDOWS |
ZES_ENABLE_SYSMAN | 1 |
表形式する前の実際のコマンド結果やその他の確認する方法 < クリックで折りたたみが開く >
-
表形式する前の実際のコマンド結果
Get-ChildItem Env:
で環境変数の一覧を確認可能です。ただ、値(Value)が長い環境変数の場合、見切れてしまいます。
見切れ対策としては、パイプライン(|
)でFormat-Table
に渡す事で回避可能です。コピー用Get-ChildItem Env: | Format-Table -AutoSize -Wrap
コマンド結果PS C:\Users\"ユーザー名"> Get-ChildItem Env: | Format-Table -AutoSize -Wrap Name Value ---- ----- ALLUSERSPROFILE C:\ProgramData APPDATA C:\Users\"ユーザー名"\AppData\Roaming CommonProgramFiles C:\Program Files\Common Files CommonProgramFiles(x86) C:\Program Files (x86)\Common Files CommonProgramW6432 C:\Program Files\Common Files COMPUTERNAME "コンピューター名(ホスト名)" ComSpec C:\WINDOWS\system32\cmd.exe DriverData C:\Windows\System32\Drivers\DriverData HOMEDRIVE C: HOMEPATH \Users\"ユーザー名" LOCALAPPDATA C:\Users\"ユーザー名"\AppData\Local LOGONSERVER \\"コンピューター名(ホスト名)" NUMBER_OF_PROCESSORS 4 OneDrive C:\Users\"ユーザー名"\OneDrive OS Windows_NT Path C:\Program Files\PowerShell\7;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C :\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program File s\dotnet\;C:\Program Files\WindowsPowerShell\Scripts;C:\Program Files\Kubernetes\Miniku be;C:\Program Files\Git\cmd;C:\Program Files\nodejs\;C:\Program Files\Docker\Docker\res ources\bin;C:\Program Files\PowerShell\7\;C:\Users\"ユーザー名"\AppData\Local\Micros oft\WindowsApps;C:\Program Files\Azure Data Studio\bin;C:\Users\"ユーザー名"\AppData \Roaming\npm;C:\Users\"ユーザー名"\AppData\Local\Programs\Microsoft VS Code\bin PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL POWERSHELL_DISTRIBUTION_CHANNEL MSI:Windows 10 Pro PROCESSOR_ARCHITECTURE AMD64 PROCESSOR_IDENTIFIER Intel64 Family 6 Model 158 Stepping 11, GenuineIntel PROCESSOR_LEVEL 6 PROCESSOR_REVISION 9e0b ProgramData C:\ProgramData ProgramFiles C:\Program Files ProgramFiles(x86) C:\Program Files (x86) ProgramW6432 C:\Program Files PSModulePath D:\ドキュメント\PowerShell\Modules;C:\Program Files\PowerShell\Modules;c:\program files \powershell\7\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\Wi ndowsPowerShell\v1.0\Modules PUBLIC C:\Users\Public SystemDrive C: SystemRoot C:\WINDOWS TEMP C:\Users\"ユーザー名"\AppData\Local\Temp TMP C:\Users\"ユーザー名"\AppData\Local\Temp USERDOMAIN "コンピューター名(ホスト名)" USERDOMAIN_ROAMINGPROFILE "コンピューター名(ホスト名)" USERNAME "ユーザー名" USERPROFILE C:\Users\"ユーザー名" VBOX_MSI_INSTALL_PATH D:\Program Files\Oracle\VirtualBox\ VS110COMNTOOLS C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\ windir C:\WINDOWS ZES_ENABLE_SYSMAN 1 PS C:\Users\"ユーザー名">
-
その他のコマンド2:Out-GridViewを使用した方法
Get-ChildItem Env:
の後にパイプライン(|
)でOut-GridViewコマンドレットに渡す事により、
環境変数の一覧を表形式で確認できます。コピー用Get-ChildItem Env: | Out-GridView
画像:Out-GridViewを使用した方法 -
その他のコマンド2:GetEnvironmentVariablesを使用した方法
プロセス環境変数は、こちらのコマンドでも確認可能。[Environment]::GetEnvironmentVariables("Process")
Get-ChildItem Env:
とまったく同じ内容となるが並び順は、Get-ChildItem Env:
ではName
で昇順ソートされているのに対して、
こちらの[Environment]::GetEnvironmentVariables("Process")
だと、順不同となっている。「GetEnvironmentVariables」でソートする場合 < クリックで折りたたみが開く >
少し脱線しますが、
[Environment]::GetEnvironmentVariables("Process")
のName
で昇順ソートしようと、
単純にパイプライン(|
)でSort-Object Name
やSort-Object -Property Name
に渡しても並べ替える事ができません。これらのコマンドだと、なぜか並べ替え不可[Environment]::GetEnvironmentVariables("Process") | Sort-Object Name [Environment]::GetEnvironmentVariables("Process") | Sort-Object -Property Name
昇順ソートする場合は、少し面倒ですが下記の方法で実行すると
Name
で並べ替える事が可能です。この方法だと並べ替え可能!$get_env_process = [Environment]::GetEnvironmentVariables("Process") foreach ($item in $get_env_process.GetEnumerator() | Sort-Object Name) { Write-Host "Key: $($item.Key)`tValue:$($item.Value)" }
コマンド結果PS C:\Users\"ユーザー名"> $get_env_process = [Environment]::GetEnvironmentVariables("Process") PS C:\Users\"ユーザー名"> foreach ($item in $get_env_process.GetEnumerator() | Sort-Object Name) { >> Write-Host "Key: $($item.Key)`tValue:$($item.Value)" >> } Key: ALLUSERSPROFILE Value:C:\ProgramData Key: APPDATA Value:C:\Users\"ユーザー名"\AppData\Roaming Key: CommonProgramFiles Value:C:\Program Files\Common Files Key: CommonProgramFiles(x86) Value:C:\Program Files (x86)\Common Files Key: CommonProgramW6432 Value:C:\Program Files\Common Files ~~~ 省略 ~~~ PS C:\Users\"ユーザー名">
- 参考情報:PowerShell - Sorting and Enumerating Hashtables
http://learningpcs.blogspot.com/2011/10/powershell-sorting-and-enumerating.html
- 参考情報:PowerShell - Sorting and Enumerating Hashtables
プロセス環境変数を新規作成(登録)する方法
下記の通り変数宣言のように実行するとプロセスの環境変数を新規作成できます。
$Env:"環境変数の名前" = "環境変数の値"
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS = 'D:\Downloads' 👈 新規作成
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS
D:\Downloads
PS C:\Users\"ユーザー名">
参考情報:New-Itemコマンドレットを使った作成方法 < クリックで折りたたみが開く >
少し回りくどい方法ですがNew-Itemコマンドレットを使う方法でも環境変数を新規作成可能です。
New-Item -Path Env: -Name "環境変数の名前" -Value "環境変数の値"
PS C:\Users\"ユーザー名"> New-Item -Path Env: -Name MYDOWNLOADS -Value 'D:\Downloads'
Name Value
---- -----
MYDOWNLOADS D:\Downloads
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Get-ChildItem Env: | Format-Table -AutoSize -Wrap
Name Value
---- -----
~~~ 省略 ~~~
LOCALAPPDATA C:\Users\"ユーザー名"\AppData\Local
LOGONSERVER \\"コンピューター名(ホスト名)"
MYDOWNLOADS D:\Downloads 👈 作成できた
NUMBER_OF_PROCESSORS 4
OneDrive C:\Users\"ユーザー名"\OneDrive
OS Windows_NT
~~~ 省略 ~~~
PS C:\Users\"ユーザー名">
プロセス環境変数の変更する方法
プロセス環境変数の値を置き換え、または追加する場合
完全に値を置き換える場合には、新規作成と同じ方法で変更可能です。
$Env:"環境変数の名前" = "環境変数の値"
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS
D:\Downloads
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS = 'C:\Users\Administrator\Downloads' 👈 変更(置き換え)
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS
C:\Users\Administrator\Downloads
PS C:\Users\"ユーザー名">
値を追加したい場合は下記の方法により追加。
$Env:"環境変数の名前" += "区切り文字" + "追加する値"
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS += ';' + 'F:\Downloads' 👈 変更(追加)
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> $Env:MYDOWNLOADS
D:\Downloads;F:\Downloads
PS C:\Users\"ユーザー名">
- 参考情報:PowerShellでさまざまな環境変数を管理する方法
https://yanor.net/wiki/?PowerShell/環境情報/環境変数の操作
参考情報:Set-Itemコマンドレットを使った変更方法 < クリックで折りたたみが開く >
PowerShellのコマンドレットで新規作成した際はNew-Item
を使用していましたが、変更する場合はSet-Item
で対応可能です。
PS C:\Users\"ユーザー名"> Set-Item -Path Env:MYDOWNLOADS -Value F:\Downloads
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Get-ChildItem Env: | Format-Table -AutoSize -Wrap
Name Value
---- -----
~~~ 省略 ~~~
LOCALAPPDATA C:\Users\"ユーザー名"\AppData\Local
LOGONSERVER \\"コンピューター名(ホスト名)"
MYDOWNLOADS F:\Downloads 👈 値のみを変更できた
NUMBER_OF_PROCESSORS 4
OneDrive C:\Users\"ユーザー名"\OneDrive
OS Windows_NT
~~~ 省略 ~~~
PS C:\Users\"ユーザー名">
プロセス環境変数の名前のみ変更する場合
Rename-Itemコマンドレットで名前のみ変更する事が可能です。
Rename-Item -Path Env:"変更前の名前" -NewName "変更後の名前"
PS C:\Users\"ユーザー名"> Rename-Item -Path Env:MYDOWNLOADS -NewName NEW_NAME_MYDOWNLOADS
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Get-ChildItem Env: | Format-Table -AutoSize -Wrap
Name Value
---- -----
~~~ 省略 ~~~
LOCALAPPDATA C:\Users\"ユーザー名"\AppData\Local
LOGONSERVER \\"コンピューター名(ホスト名)"
NEW_NAME_MYDOWNLOADS D:\Downloads 👈 名前のみ変更できた
NUMBER_OF_PROCESSORS 4
OneDrive C:\Users\"ユーザー名"\OneDrive
OS Windows_NT
~~~ 省略 ~~~
PS C:\Users\"ユーザー名">
プロセス環境変数をコピー(複製)する方法
コピーする際は、Copy-Itemコマンドレットを使用します。
Copy-Item -Path Env:"コピー元の環境変数名" -Destination Env:"新しい環境変数名を指定"
PS C:\Users\"ユーザー名"> Copy-Item -Path Env:NEW_NAME_MYDOWNLOADS -Destination Env:COPY_MYDOWNLOADS
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Get-ChildItem Env: | Format-Table -AutoSize -Wrap
Name Value
---- -----
~~~ 省略 ~~~
LOCALAPPDATA C:\Users\"ユーザー名"\AppData\Local
LOGONSERVER \\"コンピューター名(ホスト名)"
COPY_MYDOWNLOADS F:\Downloads 👈 コピーできた(コピー先)
NEW_NAME_MYDOWNLOADS F:\Downloads 👈 コピー元
NUMBER_OF_PROCESSORS 4
OneDrive C:\Users\"ユーザー名"\OneDrive
OS Windows_NT
~~~ 省略 ~~~
PS C:\Users\"ユーザー名">
システム・ユーザー環境変数を保存する方法
ここまで紹介した環境変数の設定は、そのプロセス(セッション)実行中のみ保持される設定です。
つまり、設定したPowerShellウィンドウを再起動すると異なるプロセスとして立ち上がる為、環境変数は記憶されません。
以下より次回起動後も環境変数が残る設定方法を紹介します。
ユーザーの環境変数として保存する方法
下記でログインしているユーザーの環境変数として保存できます。
[Environment]::SetEnvironmentVariable("環境変数の名前", '環境変数の値', 'User')
PS C:\Users\"ユーザー名"> [Environment]::SetEnvironmentVariable('UserDownloadFolder', 'D:¥Downloads', 'User')
PS C:\Users\"ユーザー名">
[Environment]::GetEnvironmentVariables('User') | Format-Table -AutoSize -Wrap
PS C:\Users\"ユーザー名"> [Environment]::GetEnvironmentVariables('User') | Format-Table -AutoSize -Wrap
Name Value
---- -----
OneDrive C:\Users\"ユーザー名"\OneDrive
UserDownloadFolder D:¥Downloads 👈 保存できた
TEMP C:\Users\"ユーザー名"\AppData\Local\Temp
TMP C:\Users\"ユーザー名"\AppData\Local\Temp
Path C:\Users\"ユーザー名"\AppData\Local\Microsoft\WindowsApps;C:\Program Files\Azure Data Studio\bin;
C:\Users\"ユーザー名"\AppData\Roaming\npm;C:\Users\"ユーザー名"\AppData\Local\Programs\Microso
ft VS Code\bin;C:\Users\"ユーザー名"\.dotnet\tools
PS C:\Users\"ユーザー名">
システムの環境変数として保存する方法
下記によりシステム(別の呼称だとコンピューターやマシンなど)の環境変数として保存可能です。
[Environment]::SetEnvironmentVariable("環境変数の名前", '環境変数の値', 'Machine')
PS C:\Users\"ユーザー名"> [Environment]::SetEnvironmentVariable('MachineDownloadFolder', 'F:¥Downloads', 'Machine')
PS C:\Users\"ユーザー名">
補足情報:システムの環境変数を保存する場合、管理者権限を持たず実行するとエラーが発生 < クリックで折りたたみが開く >
操作するコンピューター全体の設定となる為、管理者権限は必須でした。
PS C:\Users\"ユーザー名"> [Environment]::SetEnvironmentVariable('MachineDownloadFolder', 'F:¥Downloads', 'Machine')
MethodInvocationException: Exception calling "SetEnvironmentVariable" with "3" argument(s): "Requested registry access is not allowed."
PS C:\Users\"ユーザー名">
[Environment]::GetEnvironmentVariables('Machine') | Format-Table -AutoSize -Wrap
PS C:\Users\"ユーザー名"> [Environment]::GetEnvironmentVariables('Machine') | Format-Table -AutoSize -Wrap
Name Value
---- -----
TMP C:\WINDOWS\TEMP
PROCESSOR_ARCHITECTURE AMD64
PROCESSOR_IDENTIFIER Intel64 Family 6 Model 158 Stepping 11, GenuineIntel
DriverData C:\Windows\System32\Drivers\DriverData
MachineDownloadFolder F:¥Downloads 👈 保存できた
TEMP C:\WINDOWS\TEMP
PROCESSOR_REVISION 9e0b
ComSpec C:\WINDOWS\system32\cmd.exe
PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
VS110COMNTOOLS C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
ZES_ENABLE_SYSMAN 1
windir C:\WINDOWS
POWERSHELL_DISTRIBUTION_CHANNEL MSI:Windows 10 Pro
VBOX_MSI_INSTALL_PATH D:\Program Files\Oracle\VirtualBox\
PSModulePath C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\M
odules
Path C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowe
rShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\Win
dowsPowerShell\Scripts;C:\Program Files\Kubernetes\Minikube;C:\Program Files\Git\cmd;C:
\Program Files\nodejs\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files\Po
werShell\7\
NUMBER_OF_PROCESSORS 4
USERNAME SYSTEM
PROCESSOR_LEVEL 6
OS Windows_NT
PS C:\Users\"ユーザー名">
補足情報:環境変数を登録後にGUIで設定を確認してみた
"システムの詳細設定"より環境変数を確認しました。
-
⊞ Winキー
+R
でファイル名を指定して実行を起動 - 名前(O)欄に「
SystemPropertiesAdvanced
」と入力しEnter - システムの詳細設定が起動
画像:システムの詳細設定 - 環境変数(N)... を確認
参考情報:PowerShellのプロファイルを使ったプロセス環境変数の設定方法
PowerShellには、プロファイル($PROFILE
)という機能があり起動時に特定のPowerShellスクリプトが実行されます。
プロファイルを有効にする方法は、所定の場所に特定の名前でファイル(ps1ファイル)を配置する事で機能します。
この機能を使う事でPowerShell起動時にプロセス環境変数を定義した状態で開始できます。
-
プロファイルの情報を事前確認
PowerShell 7.3.xでプロファイルの種類を確認PS C:\Users\"ユーザー名"> $PROFILE | Format-List -Force AllUsersAllHosts : C:\Program Files\PowerShell\7\profile.ps1 AllUsersCurrentHost : C:\Program Files\PowerShell\7\Microsoft.PowerShell_profile.ps1 CurrentUserAllHosts : D:\ドキュメント\PowerShell\profile.ps1 CurrentUserCurrentHost : D:\ドキュメント\PowerShell\Microsoft.PowerShell_profile.ps1 Length : 53 PS C:\Users\"ユーザー名">
$PROFILEの値を確認PS C:\Users\"ユーザー名"> $PROFILE D:\ドキュメント\PowerShell\Microsoft.PowerShell_profile.ps1 PS C:\Users\"ユーザー名">
-
プロファイルの存在チェック
存在チェックPS C:\Users\"ユーザー名"> Test-Path $PROFILE False PS C:\Users\"ユーザー名">
結果が「
False
」となり存在しない。実際に
D:\ドキュメント\PowerShell
配下を確認しMicrosoft.PowerShell_profile.ps1
はありませんでした。
画像:D:\ドキュメント\PowerShell
配下を確認 -
プロファイルの作成
New-ItemコマンドレットでPowerShellスクリプトファイル(*.ps1)を作成PS C:\Users\"ユーザー名"> New-Item -Path $PROFILE -ItemType 'file' -Force Directory: D:\ドキュメント\PowerShell Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2023/11/15 16:03 0 Microsoft.PowerShell_profile.ps1 PS C:\Users\"ユーザー名">
-
任意のテキストエディターでプロファイル用のスクリプトファイルを起動
VS Codeで編集する場合PS C:\Users\"ユーザー名"> code $PROFILE PS C:\Users\"ユーザー名">
フリーのテキストエディタで編集する場合(以下はサクラエディタの実行ファイルを指定)PS C:\Users\"ユーザー名"> & 'C:\Program Files (x86)\sakura\sakura.exe' $PROFILE PS C:\Users\"ユーザー名">
メモ帳で編集する場合PS C:\Users\"ユーザー名"> notepad $PROFILE PS C:\Users\"ユーザー名">
-
プロファイル用のスクリプトにプロセス環境変数を定義するコードを追加し保存する
プロファイルにプロセス環境変数を作成するコードを追加+ # プロファイルで設定するプロセス環境変数 + $Env:ProfileDownloadFolder = 'D:\ドキュメント\Downloads'
-
PowerShellを起動しプロセス環境変数が定義されているか確認
開始時にプロセス環境変数が定義されている事を確認PS C:\Users\"ユーザー名"> Get-ChildItem Env: Name Value ---- ----- ~~~ 省略 ~~~ OS Windows_NT Path C:\Program Files\PowerShell\7;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C… PATHEXT .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL POWERSHELL_DISTRIBUTION_CHANN… MSI:Windows 10 Pro PROCESSOR_ARCHITECTURE AMD64 PROCESSOR_IDENTIFIER Intel64 Family 6 Model 158 Stepping 11, GenuineIntel PROCESSOR_LEVEL 6 PROCESSOR_REVISION 9e0b ProfileDownloadFolder D:\ドキュメント\Downloads 👈 追加された ProgramData C:\ProgramData ProgramFiles C:\Program Files ProgramFiles(x86) C:\Program Files (x86) ProgramW6432 C:\Program Files PSModulePath D:\ドキュメント\PowerShell\Modules;C:\Program Files\PowerShell\Modules;c:\program files… PUBLIC C:\Users\Public SESSIONNAME Console ~~~ 省略 ~~~ PS C:\Users\"ユーザー名">
なお、プロファイルの無効化は簡単で作成したPowerShellスクリプトを削除するだけでOK。
Remove-Itemコマンドレットで削除PS C:\Users\"ユーザー名"> Remove-Item -Path $PROFILE PS C:\Users\"ユーザー名"> PS C:\Users\"ユーザー名"> Get-Item $PROFILE Get-Item: Cannot find path 'D:\ドキュメント\PowerShell\Microsoft.PowerShell_profile.ps1' because it does not exist. PS C:\Users\"ユーザー名">
参考情報:PowerShell 5.1.xでプロファイルの種類や初期値を確認 < クリックで折りたたみが開く >
PS C:\Users\"ユーザー名"> $PROFILE | Format-List -Force
AllUsersAllHosts : C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
AllUsersCurrentHost : C:\Windows\System32\WindowsPowerShell\v1.0\Microsoft.PowerShell_profile.ps1
CurrentUserAllHosts : D:\ドキュメント\WindowsPowerShell\profile.ps1
CurrentUserCurrentHost : D:\ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
Length : 60
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> $PROFILE
C:\Users\"ユーザー名"\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\Users\"ユーザー名">
システム・ユーザー・プロセス環境変数を削除する方法
プロセスの環境変数を削除する方法
$Env:"削除対象の環境変数名" = ''
PS C:\Users\"ユーザー名"> $Env:UserDownloadFolder = ''
PS C:\Users\"ユーザー名">
補足情報:削除前後の環境変数一覧 < クリックで折りたたみが開く >
PS C:\Users\"ユーザー名"> Get-ChildItem Env:
Name Value
---- -----
~~~ 省略 ~~~
TMP C:\Users\"ユーザー名"\AppData\Local\Temp
USERDOMAIN "コンピューター名(ホスト名)"
USERDOMAIN_ROAMINGPROFILE "コンピューター名(ホスト名)"
UserDownloadFolder D:¥Downloads 👈 削除対象
USERNAME "ユーザー名"
USERPROFILE C:\Users\"ユーザー名"
VBOX_MSI_INSTALL_PATH D:\Program Files\Oracle\VirtualBox\
~~~ 省略 ~~~
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Get-ChildItem Env:
Name Value
---- -----
~~~ 省略 ~~~
TMP C:\Users\"ユーザー名"\AppData\Local\Temp
USERDOMAIN "コンピューター名(ホスト名)"
USERDOMAIN_ROAMINGPROFILE "コンピューター名(ホスト名)" ↓ ここと
USERNAME "ユーザー名" ↑ ここの間に合った環境変数「UserDownloadFolder」が削除された
USERPROFILE C:\Users\"ユーザー名"
VBOX_MSI_INSTALL_PATH D:\Program Files\Oracle\VirtualBox\
~~~ 省略 ~~~
PS C:\Users\"ユーザー名">
参考情報:コマンドレット「Remove-Item」や「Clear-Item」を使ったプロセス環境変数の削除方法 < クリックで折りたたみが開く >
前述している$Env:"削除対象の環境変数名" = ''
の方法と同様の結果となる。
これらコマンドレットの方法だと少し回りくどく感じる。
PS C:\Users\"ユーザー名"> Remove-Item -Path Env:UserDownloadFolder
PS C:\Users\"ユーザー名">
PS C:\Users\"ユーザー名"> Clear-Item -Path Env:UserDownloadFolder
PS C:\Users\"ユーザー名">
ユーザーの環境変数を削除する方法
下記でログインしているユーザーの環境変数を削除可能です。
[Environment]::SetEnvironmentVariable("削除対象の環境変数名", '', 'User')
PS C:\Users\"ユーザー名"> [Environment]::SetEnvironmentVariable('UserDownloadFolder', '', 'User')
PS C:\Users\"ユーザー名">
前述している通り[Environment]::GetEnvironmentVariables('User')
の結果では即時反映されますが、
Get-ChildItem Env:
ではプロセス(PowerShellウィンドウ)を再起動しないと反映されないようです。
システムの環境変数を削除する方法
下記によりシステム(別の呼称だとコンピューターやマシンなど)の環境変数を削除できます。
[Environment]::SetEnvironmentVariable("削除対象の環境変数名", '', 'Machine')
PS C:\Users\"ユーザー名"> [Environment]::SetEnvironmentVariable('MachineDownloadFolder', '', 'Machine')
PS C:\Users\"ユーザー名">
前述している通り[Environment]::GetEnvironmentVariables('Machine')
の結果では即時反映されますが、
Get-ChildItem Env:
ではプロセス(PowerShellウィンドウ)を再起動しないと反映されないようです。
補足情報:システムの環境変数を削除する場合でも、管理者権限を持たず実行するとエラーが発生 < クリックで折りたたみが開く >
PS C:\Users\"ユーザー名"> [Environment]::SetEnvironmentVariable('MachineDownloadFolder', '', 'Machine')
MethodInvocationException: Exception calling "SetEnvironmentVariable" with "3" argument(s): "Requested registry access is not allowed."
PS C:\Users\"ユーザー名">
参考情報
環境変数まわりの参考情報
- Microsoft公式 about_Environment_Provider(環境変数について)
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_environment_provider - PowerShell 環境変数をメンテナンスする方法
https://yanor.net/wiki/?PowerShell/環境情報/環境変数の操作 - Out-GridViewコマンドレットで環境変数を見る方法
https://www.kadinche.com/tech-blog/powershell-e3-81-a7-e7-92-b0-e5-a2-83-e5-a4-89-e6-95-b0-e3-82-92gui-e3-81-a7-e4-b8-80-e8-a6-a7-e8-a1-a8-e7-a4-ba - Windowsの環境変数について解説
https://qiita.com/jeyei/items/2c385e4e0488a5fa2591
https://qiita.com/aromatibus/items/391353ca94137348bee2
PowerShellまわりの参考情報
- PowerShell プロファイルの全般
https://acoustic-groove2.hatenablog.com/entry/2017/12/06/013928
https://www.zacoding.com/post/powershell-profile/ - PowerShell プロファイルにおけるホストとユーザーの定義
https://blog.shibata.tech/entry/2016/10/07/225835 - PowerShellの先頭に「&(アンパサンド)」をつけて実行するとコマンドとして実行される
https://minegishirei.hatenablog.com/entry/2023/02/15/165222 - PowerShell コマンド結果の値が長く見切れた場合の対処方法
https://bizlog.tech/windows-powershell-format
まとめ
- 環境変数の一覧確認
Get-ChildItem Env:
- プロセス環境変数の登録
$Env:"環境変数の名前" = "環境変数の値"
- プロセス環境変数の変更
- 値のみ変更
$Env:"環境変数の名前" = "変更する値"
- 名前のみ変更
Rename-Item -Path Env:"変更前の名前" -NewName "変更後の名前"
- コピー
Copy-Item -Path Env:"コピー元の環境変数名" -Destination Env:"新しい環境変数名を指定"
- 値のみ変更
- 環境変数の保存
- ユーザー環境変数として保存
[Environment]::SetEnvironmentVariable("環境変数の名前", '環境変数の値', 'User')
- システム環境変数として保存(管理者として実行)
[Environment]::SetEnvironmentVariable("環境変数の名前", '環境変数の値', 'Machine')
- プロファイルでPowerShell起動時にプロセス環境変数を設定
-
$PROFILE
を作成 - 作成したPowerShellスクリプトに環境変数を登録するコードを追加
- 設定完了
-
- ユーザー環境変数として保存
- 環境変数の削除
- プロセス環境変数の削除
$Env:"削除対象の環境変数名" = ''
- ユーザー環境変数の削除
[Environment]::SetEnvironmentVariable("削除対象の環境変数名", '', 'User')
- システム環境変数の削除(管理者として実行)
[Environment]::SetEnvironmentVariable("削除対象の環境変数名", '', 'Machine')
- プロセス環境変数の削除
関連記事
Discussion
こちらに記載した下記の内容は誤りです。後日、修正予定。
2024.04.20現在、上記の間違えを修正しました。