👩‍💼

PowerShellでWindows環境変数を“一覧確認・作成・変更・削除”する方法

2023/11/22に公開
2

概要

Windows OSでPowerShellの自動化ツールを作成する際、コマンドレットで環境変数を編集できた方が利便性が高いと感じてはいましたが、今まで手をつけていませんでした。

私なりに調べた結果を共有します。

この記事のターゲット

  • Windowsユーザーの方
  • PowerShellユーザーの方
  • 下記3点をコマンドレットで実現したい方
    • プロセス環境変数を設定
    • ユーザー環境変数を設定
    • システム環境変数を設定

環境

PowerShell Coreのバージョン
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におけるシステム・ユーザー・プロセス環境変数のイメージ図
画像: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-ItemGet-ChildItemがあります。

規定値として、すでに登録されている環境変数$Env:CommonProgramFilesを使って例をあげます。

\$Env:CommonProgramFiles = C: \backslash Program Files \backslash Common Files

環境変数の値がパスでありGet-Itemを使用し参照する例

下記の通りGet-Itemではパスの終端(一番右側)にあるファイルもしくはフォルダーの情報を表示。

コピー用
Get-Item $Env:"環境変数名"
Get-Itemコマンドレットの実行結果
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:"環境変数名"
Get-ChildItemコマンドレットの実行結果(フォルダーを指定した場合)
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\"ユーザー名">
Get-ChildItemコマンドレットの実行結果(ファイルを指定した場合)
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の違いです。より詳しい情報は、以下のリンクを参照してください。

私は他にも色々なことができます。例えば、コードや詩や物語などを作ったり、文章を書いたり改善したりすることができます。もし興味があれば、私に話しかけてみてください。😊.

ソース: 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を使用し環境変数を確認した際の画面
    画像:Out-GridViewを使用した方法

  • その他のコマンド2:GetEnvironmentVariablesを使用した方法
    プロセス環境変数は、こちらのコマンドでも確認可能。

    [Environment]::GetEnvironmentVariables("Process")
    

    Get-ChildItem Env:とまったく同じ内容となるが並び順は、Get-ChildItem Env:ではNameで昇順ソートされているのに対して、
    こちらの[Environment]::GetEnvironmentVariables("Process")だと、順不同となっている。

    「GetEnvironmentVariables」でソートする場合 < クリックで折りたたみが開く >

    少し脱線しますが、[Environment]::GetEnvironmentVariables("Process")Nameで昇順ソートしようと、
    単純にパイプライン(|)で Sort-Object NameSort-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\"ユーザー名">
    

プロセス環境変数を新規作成(登録)する方法

下記の通り変数宣言のように実行するとプロセスの環境変数を新規作成できます。

コピー用
$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\"ユーザー名">
参考情報: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\"ユーザー名">
補足情報:システムの環境変数を保存する場合、管理者権限を持たず実行するとエラーが発生 < クリックで折りたたみが開く >

操作するコンピューター全体の設定となる為、管理者権限は必須でした。

管理者としてPowerShellを実行していないとエラー
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で設定を確認してみた

"システムの詳細設定"より環境変数を確認しました。

  1. ⊞ Winキー + Rでファイル名を指定して実行を起動
  2. 名前(O)欄に「SystemPropertiesAdvanced」と入力しEnter
  3. システムの詳細設定が起動

登録した環境変数をシステムの詳細設定 - 環境変数で確認
画像:システムの詳細設定 - 環境変数(N)... を確認

参考情報:PowerShellのプロファイルを使ったプロセス環境変数の設定方法

PowerShellには、プロファイル($PROFILE)という機能があり起動時に特定のPowerShellスクリプトが実行されます。
プロファイルを有効にする方法は、所定の場所に特定の名前でファイル(ps1ファイル)を配置する事で機能します。

この機能を使う事でPowerShell起動時にプロセス環境変数を定義した状態で開始できます。

  1. プロファイルの情報を事前確認

    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\"ユーザー名">
    
  2. プロファイルの存在チェック

    存在チェック
    PS C:\Users\"ユーザー名"> Test-Path $PROFILE
    False
    PS C:\Users\"ユーザー名">
    

    結果が「False」となり存在しない。

    実際にD:\ドキュメント\PowerShell配下を確認しMicrosoft.PowerShell_profile.ps1はありませんでした。
    Windows OSのエクスプローラーで「D:\ドキュメント\PowerShell」配下を確認した結果
    画像:D:\ドキュメント\PowerShell配下を確認

  3. プロファイルの作成

    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\"ユーザー名">
    
  4. 任意のテキストエディターでプロファイル用のスクリプトファイルを起動

    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\"ユーザー名">
    
  5. プロファイル用のスクリプトにプロセス環境変数を定義するコードを追加し保存する

    プロファイルにプロセス環境変数を作成するコードを追加
    + # プロファイルで設定するプロセス環境変数
    + $Env:ProfileDownloadFolder = 'D:\ドキュメント\Downloads'
    
  6. 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でプロファイルの種類や初期値を確認 < クリックで折りたたみが開く >
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\"ユーザー名">
Windows 10 初期値(ドキュメントフォルダーをパスを変更していない場合)
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:"削除対象の環境変数名" = ''の方法と同様の結果となる。
これらコマンドレットの方法だと少し回りくどく感じる。

Remove-Itemコマンドレットで削除
PS C:\Users\"ユーザー名"> Remove-Item -Path Env:UserDownloadFolder
PS C:\Users\"ユーザー名">
Clear-Itemコマンドレットで削除
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ウィンドウ)を再起動しないと反映されないようです。

補足情報:システムの環境変数を削除する場合でも、管理者権限を持たず実行するとエラーが発生 < クリックで折りたたみが開く >
管理者として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\"ユーザー名">

参考情報

環境変数まわりの参考情報

PowerShellまわりの参考情報

まとめ

  • 環境変数の一覧確認
    Get-ChildItem Env:
  • プロセス環境変数の登録
    $Env:"環境変数の名前" = "環境変数の値"
  • プロセス環境変数の変更
    • 値のみ変更
      $Env:"環境変数の名前" = "変更する値"
    • 名前のみ変更
      Rename-Item -Path Env:"変更前の名前" -NewName "変更後の名前"
    • コピー
      Copy-Item -Path Env:"コピー元の環境変数名" -Destination Env:"新しい環境変数名を指定"
  • 環境変数の保存
    • ユーザー環境変数として保存
      [Environment]::SetEnvironmentVariable("環境変数の名前", '環境変数の値', 'User')
    • システム環境変数として保存(管理者として実行)
      [Environment]::SetEnvironmentVariable("環境変数の名前", '環境変数の値', 'Machine')
    • プロファイルでPowerShell起動時にプロセス環境変数を設定
      1. $PROFILEを作成
      2. 作成したPowerShellスクリプトに環境変数を登録するコードを追加
      3. 設定完了
  • 環境変数の削除
    • プロセス環境変数の削除
      $Env:"削除対象の環境変数名" = ''
    • ユーザー環境変数の削除
      [Environment]::SetEnvironmentVariable("削除対象の環境変数名", '', 'User')
    • システム環境変数の削除(管理者として実行)
      [Environment]::SetEnvironmentVariable("削除対象の環境変数名", '', 'Machine')

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion

akiGAMEBOY५✍🤖はれときどきZennakiGAMEBOY५✍🤖はれときどきZenn

こちらに記載した下記の内容は誤りです。後日、修正予定。

誤り
$Env:"環境変数の名前" = += "区切り文字" + "追加する値"
正しく修正すると
- $Env:"環境変数の名前" = += "区切り文字" + "追加する値"
+ $Env:"環境変数の名前" += "区切り文字" + "追加する値"