首发于 sysin

Windows 10 环境变量:如何通过 CMD 和 PowerShell 写入环境变量

请访问原文链接:

,查看最新版。转载请保留出处。

作者:gc(at) sysin.org ,主页:

1. 环境变量简介

环境变量 (environment variables) 是在操作系统中用来指定操作系统运行环境的一些参数。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。 Windows 和 DOS 操作系统中的 path 环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 path 中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

Environment variables:环境变量

  • User variables:用户变量
  • System variables:系统变量

环境变量可分为用户变量与系统变量两类,在注册表中都有对应的项。

1.1 用户变量

用户变量仅针对当前用户有效。

  • 用户变量所在位置: HKEY_CURRENT_USER\Environment



1.2 系统变量

系统变量为全局变量,对所有用户有效。

  • 系统变量所在位置: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment



1.3 图形界面操作环境变量

图形界面(Windows 10):此电脑 --> 属性 --> 高级系统设置 --> 高级 --> 环境变量...

可以直接查看、新建、编辑和删除环境变量(用户和系统),步骤比较简单,这里不在赘述。

注意: 文本编辑方式,在原有变量的基础上添加英文状态下的分号,然后添加路径名。不要删除原先的系统变量,只要用分号隔开,然后添加路径名,结尾也需要添加分号。

2. CMD 操作环境变量

2.1 查看环境变量

查看当前所有可用的环境变量 :输入 set 即可查看。

查看某个环境变量 :输入 set 变量名 即可,比如想查看 path 变量的值,即输入:set path

或者使用 echo %变量名% echo %path%,注意用户变量和系统变量都有 path,显示的是两者合集,系统变量在前面。

2.2 系统内置环境变量

系统内置的环境变量如下:

%ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
%APPDATA% 局部 返回默认情况下应用程序存储数据的位置。
%CD% 局部 返回当前目录字符串。
%CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date
%ERRORLEVEL% 系统 返回最近使用过的命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSEVER% 局部 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值: x86IA64
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器修订号的系统变量。
%PROMPT% 局部 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0  32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器。
%SYSTEMROOT% 系统 返回 Windows XP 根目录的位置。
%TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time
%USERDOMAIN% 局部 返回包含用户帐户的域的名称。
%USERNAME% 局部 返回当前登录的用户的名称。
%UserProfile% 局部 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。

2.3 CMD 设置环境变量(临时)

添加或者修改环境变量 set 变量名=变量内容

# 设置变量 tmp 的值为 d:\tmp
set tmp=d:\tmp
# 设置变量 tmp 的值为 c:\tmp
set tmp=c:\tmp
# 上述已经设置 tmp 的值,这里会直接覆盖原有值

设置为空 set 变量名=

set tmp=

给变量追加内容 : set 变量名=%变量名%;变量内容

比如给 path 变量添加一个路径

set path=%path%;d:\go

即可将 d:\go 添加到 path 中,再次执行 set path=%path%;c:\tmp ,那么,使用 set path 语句来查看的时候,将会有:d:\go;c:\tmp,而不是只有 c:\tmp。

注意,只在当前命令行窗口起作用。因此在图形界面的环境变量无法查看到。

2.4 通过写注册表设置环境变量

set 命令对环境变量操作只对当前会话有效,并没有保存更改,持久化设置环境变量,需要通过修改注册表来实现。

环境变量所在注册表位置如下:

  • 用户变量所在位置: HKEY_CURRENT_USER\Environment
  • 系统变量所在位置: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment

示例:新建和追加环境变量

这里以 go 语言环境变量配置为例:

图形界面(Windows 10):此电脑 --> 属性 --> 高级系统设置 --> 高级 --> 环境变量...

  • 用户变量:
  • 新建:GOPATH = %UserProfile%\gopath (例如:当前用户是 C:\Users\Administrators)
  • PATH 变量增加一条 %GOPATH%\bin
  • 系统变量:
  • 新建:GOROOT = C:\go
  • PATH 增加了一条 %GOROOT%\bin
::用户变量所在位置:`HKEY_CURRENT_USER\Environment`
set USERregpath=HKEY_CURRENT_USER\Environment
::系统变量所在位置:`HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment`
set MACHINEregpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
::用户环境变量
reg add "%USERregpath%" /v "GOPATH" /t REG_SZ /d "%UserProfile%\gopath" /f
::PATH 追加
::查询原有 PATH 的值
for /F "tokens=3*" %i in ('reg query "%USERregpath%" /v "path" 2^>nul') do echo %i
for /F "tokens=3*" %i in ('reg query "%MACHINEregpath%" /v "path" 2^>nul') do echo %i
::在 .bat 或者 .cmd 批处理文件中,%i 应该写成 %%i
for /F "tokens=3*" %%i in ('reg query "%USERregpath%" /v "path" 2^>nul') do echo %%i
for /F "tokens=3*" %%i in ('reg query "%MACHINEregpath%" /v "path" 2^>nul') do echo %%i
for /F "tokens=3*" %i in ('reg query "%USERregpath%" /v "path" 2^>nul') do ( set USERpath=%i)
echo USERpath=%USERpath%
reg add "%USERregpath%" /v "Path" /t REG_EXPAND_SZ /d ""%USERpath%"%GOPATH%\bin;" /f
:: 经过测试,巨硬公司的不同 Windows 10 版本的 PATH 变量竟然写法不一样,有的以分号结尾,有的没有分号。所以命令还是要加上分号分割,结尾分号取消
reg add "%USERregpath%" /v "Path" /t REG_EXPAND_SZ /d "%USERpath%;%GOPATH%\bin" /f
::系统环境变量
reg add "%MACHINEregpath%" /v "GOROOT" /t REG_SZ /d "C:\go" /f
::PATH 追加
for /F "tokens=3*" %i in ('reg query "%MACHINEregpath%" /v "path" 2^>nul') do ( set MACHINEpath=%i)
echo MACHINEpath=%MACHINEpath%
reg add "%MACHINEregpath%" /v "Path" /t REG_EXPAND_SZ /d "%USERpath%;%GOROOT%\bin" /f

写成批处理(保存为 .bat 或者 .cmd 文件)

::From: www.sysin.org
::OS环境: Windows 10 (Include Server 2016/2019)
@echo off
::用户变量所在位置:`HKEY_CURRENT_USER\Environment`
set USERregpath=HKEY_CURRENT_USER\Environment
::系统变量所在位置:`HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment`
set MACHINEregpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
echo.
echo =====================================================
echo                Go 环境变量设置
echo =====================================================
echo.
set /P EN=请按 回车键 确认设置开始!
echo.
::用户环境变量
echo 新建用户环境变量 GOPATH=%UserProfile%\gopath
reg add "%USERregpath%" /v "GOPATH" /t REG_SZ /d "%UserProfile%\gopath" /f
echo.
echo 增加用户环境变量 PATH=%GOPATH%\bin
for /F "tokens=3*" %%i in ('reg query "%USERregpath%" /v "path" 2^>nul') do ( set USERpath=%%i)
echo USERpath=%USERpath%
reg add "%USERregpath%" /v "Path" /t REG_EXPAND_SZ /d "%USERpath%;%GOPATH%\bin" /f
echo.
::系统环境变量
echo 新建系统环境变量 GOROOT=C:\go
reg add "%MACHINEregpath%" /v "GOROOT" /t REG_SZ /d "C:\go" /f
echo.
echo 增加系统环境变量 PATH=%GOROOT%\bin
for /F "tokens=3*" %%i in ('reg query "%MACHINEregpath%" /v "path" 2^>nul') do ( set MACHINEpath=%%i)
echo MACHINEpath=%MACHINEpath%
reg add "%MACHINEregpath%" /v "Path" /t REG_EXPAND_SZ /d "%USERpath%;%GOROOT%\bin" /f
echo.
color 17
echo ************ Go 环境变量设置结束! ***********
echo.
echo 请按 任意键 退出!
pause>nul

3. Powershell 操作环境变量

3.1 Powershell 设置环境变量(临时)

查看环境变量

PowerShell 把所有环境变量的记录保存在 env: 虚拟驱动中, ls env: 命令可以列出所有环境变量。根据环境变量的名称就可以使用 $env:name 访问。

PS> ls env:
Name                           Value
----                           -----
ALLUSERSPROFILE                C:\ProgramData
APPDATA                        C:\Users\Administrator\AppData\Roaming
CLIENTNAME                     SAMBP
CommonProgramFiles             C:\Program Files\Common Files
CommonProgramFiles(x86)        C:\Program Files (x86)\Common Files
CommonProgramW6432             C:\Program Files\Common Files
COMPUTERNAME                   SYSIN-NJ
ComSpec                        C:\Windows\system32\cmd.exe
DriverData                     C:\Windows\System32\Drivers\DriverData
GOPATH                         C:\Users\Administrator\go
HOMEDRIVE                      C:
HOMEPATH                       \Users\Administrator
LOCALAPPDATA                   C:\Users\Administrator\AppData\Local
LOGONSERVER                    \\SYSIN-NJ
NUMBER_OF_PROCESSORS           1
OS                             Windows_NT
Path                           C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPo...
PATHEXT                        .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL
PROCESSOR_ARCHITECTURE         AMD64
PROCESSOR_IDENTIFIER           AMD64 Family 23 Model 49 Stepping 0, AuthenticAMD
PROCESSOR_LEVEL                23
PROCESSOR_REVISION             3100
ProgramData                    C:\ProgramData
ProgramFiles                   C:\Program Files
ProgramFiles(x86)              C:\Program Files (x86)
ProgramW6432                   C:\Program Files
PSModulePath                   C:\Users\Administrator\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPo...
PUBLIC                         C:\Users\Public
SESSIONNAME                    RDP-Tcp#103
SystemDrive                    C:
SystemRoot                     C:\Windows
TEMP                           C:\Users\ADMINI~1\AppData\Local\Temp\2
TMP                            C:\Users\ADMINI~1\AppData\Local\Temp\2
USERDOMAIN                     SYSIN-NJ
USERDOMAIN_ROAMINGPROFILE      SYSIN-NJ
USERNAME                       Administrator
USERPROFILE                    C:\Users\Administrator
windir                         C:\Windows

可以参考 CMD 中的变量,将 CMD 中的 %变量名% 替换为 PowerShell 的格式 $env:变量名。

比如 CMD 中的 %windir% 替换成 PowerShell 就是 $env:windir:

PS> $env:windir
C:\Windows

在比如 CMD 中的 %USERNAME% 替换成 PowerShell 就是 $env:USERNAME:

PS> $env:USERNAME
Administrator

PowerShell 环境变量也可以象其它变量那样使用。比如直接解析到文本中。

PS> $env:ProgramFiles
C:\Program Files
PS> "Installation dir is $env:ProgramFiles\sysin"
Installation dir is C:\Program Files\sysin

小技巧: 查看 path 的特殊方法

PS > (type env:path) -split ';'
#列表分割换行显示
PS > (type env:path) -split ';' | sls bin
#过滤搜索包含bin的条目

创建或者更新环境变量

语法:$env:变量名称="变量值"

如果原有变量名称已经存在则覆盖

PS> $env:Test1="sysin.org"
PS> $env:Test2="www.sysin.org"
PS> ls env:Test*
Name                           Value
----                           -----
Test1                       sysin.org
Test2                       www.sysin.org

删除环境变量

语法:del env:变量名称。例如要删除环境变量中的 windir:

PS> del env:windir
PS> $env:windir

不用担心,这里跟 set 操作环境变量一样,只对当前会话有效。

追加环境变量

$env:变量名称="$env:变量名称;变量值"

比如,常见的在 PATH 后面追加一条

$env:Path="$env:Path;C:\sysin"

3.2 PowerShell 持久化操作环境变量

上述对于环境变量的操作只会影响当前 PowerShell 会话,并没有更新在系统上,所以这里也没有区分"用户变量"和"系统变量",操作的是两者的合集。

要写入环境变量到系统中,需要使用 .NET 方法 [environment]::SetEnvironmentvariable 操作环境变量。

首先我们看看如何分别查看"用户变量"和"系统变量"中的 "PATH"

#用户变量
PS> [environment]::GetEnvironmentvariable("Path", "User")
c:\powershellscript
#在某些 Windows 10 版本中以分号结尾
C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;
#系统变量
PS> [environment]::GetEnvironmentvariable("Path", "Machine")
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;
#在某些 Windows 10 版本中又没有分号(巨硬阿三太不讲究)
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\

好在写入环境变量的时候,两个分号也没有问题,所以在追加环境变量的时候原有变量值以分号分割,结尾不用分号为妥。

写入环境变量

# 用户变量
[environment]::SetEnvironmentvariable("变量名称", "变量值", "User")
# 系统变量
[environment]::SetEnvironmentvariable("变量名称", "变量值", "Machine")

示例:新建和追加环境变量

这里以 go 语言环境变量配置为例:

图形界面(Windows 10):此电脑 --> 属性 --> 高级系统设置 --> 高级 --> 环境变量...

  • 用户变量:
  • 新建:GOPATH = %UserProfile%\gopath (例如:当前用户是 C:\Users\Administrators)
  • PATH 变量增加一条 %GOPATH%\bin
  • 系统变量:
  • 新建:GOROOT = C:\go
  • PATH 增加了一条 %GOROOT%\bin

Powershell 实现如下:

[environment]::SetEnvironmentvariable("GOPATH", "$env:USERPROFILE\gopath", "User")
#调用命令结果:$(命令)
#获取原有用户 PATH 变量:$([environment]::GetEnvironmentvariable("Path", "User"))
#注意 PATH 中条目以分号结尾