从 cmd.exe 设置一个持久环境变量

我必须在不同的 Windows 机器上设置环境变量,但是我不想在“我的电脑”的属性屏幕上手动更改它们

我想用一个批处理文件从命令行执行。据我所知,使用 set 只会更改我将在命令窗口中调用的进程的变量。

我想明确地设置它,所以以后,当运行一个新进程时,它将使用我设置的那些新设置。有没有办法从命令行做到这一点?

174888 次浏览

环境变量的 MSDN 文档告诉你该怎么做:

若要以编程方式添加或修改系统环境变量,请将它们添加到 系统 CurrentControlSet 控制会话管理器环境注册表项,然后将设置为字符串“ Environment”的 lParam 广播 设置改变消息。这允许应用程序(比如 shell)获取您的更新。

您当然需要管理员权限才能做到这一点。我知道没有从 Windows 批处理中广播 Windows 消息的方法,所以您需要编写一个小程序来完成这项工作。

使用 SETX 命令(注意‘ x’后缀)设置在 cmd 窗口关闭后仍然存在的变量。

例如,要将 env 变量“ foo”的值设置为“ bar”:

setx foo bar /m

不过,如果你打印用法(setx /?) ,那么显示的“注释”还是值得一读的,特别是:

  1. 在本地系统上,此工具创建或修改的变量将在以后的命令窗口中可用,但 不在当前 CD.exe 命令窗口中不可用。

  2. 在远程系统上,此工具创建或修改的变量将可用 在下一次登录时

在 PowerShell 中,[环境] : SetEnvironment 变量命令。

具有 VBScript(. vbs)的示例

Sub sety(wsh, action, typey, vary, value)
Dim wu
Set wu = wsh.Environment(typey)
wui = wu.Item(vary)
Select Case action
Case "ls"
WScript.Echo wui
Case "del"
On Error Resume Next
wu.remove(vary)
On Error Goto 0
Case "set"
wu.Item(vary) = value
Case "add"
If wui = "" Then
wu.Item(vary) = value
ElseIf InStr(UCase(";" & wui & ";"), UCase(";" & value & ";")) = 0 Then
wu.Item(vary) = value & ";" & wui
End If
Case Else
WScript.Echo "Bad action"
End Select
End Sub


Dim wsh, args
Set wsh = WScript.CreateObject("WScript.Shell")
Set args = WScript.Arguments
Select Case WScript.Arguments.Length
Case 3
value = ""
Case 4
value = args(3)
Case Else
WScript.Echo "Arguments - 0: ls,del,set,add; 1: user,system, 2: variable; 3: value"
value = "```"
End Select
If Not value = "```" Then
' 0: ls,del,set,add; 1: user,system, 2: variable; 3: value
sety wsh, args(0), args(1), UCase(args(2)), value
End If

实际上,SETTEST _ VARIABLE = 值仅适用于当前进程,因此需要 SETX。一个在用户级永久存储环境变量的快速示例。

  1. 在 cmd 中,SETX TEST_VARIABLE etc. 尚未应用(echo %TEST_VARIABLE%显示 %TEST_VARIABLE%,
  2. 快速检查: 打开 cmd,echo %TEST_VARIABLE%显示 etc
  3. GUI 检查: 系统属性-> 高级-> 环境变量-> 用户变量-> 您应该看到值为 etc的变量 TEST _ VARIABLE。
:: Sets environment variables for both the current `cmd` window
::   and/or other applications going forward.
:: I call this file keyz.cmd to be able to just type `keyz` at the prompt
::   after changes because the word `keys` is already taken in Windows.


@echo off


:: set for the current window
set APCA_API_KEY_ID=key_id
set APCA_API_SECRET_KEY=secret_key
set APCA_API_BASE_URL=https://paper-api.alpaca.markets


:: setx also for other windows and processes going forward
setx APCA_API_KEY_ID     %APCA_API_KEY_ID%
setx APCA_API_SECRET_KEY %APCA_API_SECRET_KEY%
setx APCA_API_BASE_URL   %APCA_API_BASE_URL%


:: Displaying what was just set.
set apca


:: Or for copy/paste manually ...
:: setx APCA_API_KEY_ID     'key_id'
:: setx APCA_API_SECRET_KEY 'secret_key'
:: setx APCA_API_BASE_URL   'https://paper-api.alpaca.markets'