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


123

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

我想使用批处理文件从命令行执行此操作。据我了解,使用set只会更改我将在命令窗口中调用的进程的变量。

我想绝对设置它,因此以后,在运行新进程时,它将使用我设置的那些新设置。有没有办法从命令行执行此操作?


如果它们将变为永久性,从命令行设置它们有什么意义?您无需再次执行此操作。
直播

12
是的,但是我必须在多台计算机上执行此操作,因此运行脚本可以节省一些时间。
亚瑟

2
好的,在这种情况下,如果SETX对您不可用,则可以在一台计算机上设置环境并导出以下所述的条目,并具有一个.reg文件。
d-live

这就是我所做的。谢谢。
亚瑟

1
RE:“从命令行设置它们的意义是什么……”在我工作的地方,始终需要将多个持久性环境变量设置为不同的值,以便测试/开发不同版本的软件。许可意味着它无法通过其他任何方式完成(例如,运行VM),因此我们唯一的方法是在批处理脚本中使用SETX。使用.reg不太好,因为它很难记录/准确地查看发生了什么
Tony Eastwood 2014年

Answers:


189

使用SETX命令(注意后缀“ x”)来设置在cmd窗口关闭后仍保留的变量。

例如,设置一个值为“ bar”的环境变量“ foo”:

setx foo bar

尽管值得一读的是打印用法(setx /?)时显示的“注释”,尤其是:

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

3)在远程系统上,此工具创建或修改的变量将在下一次登录会话时可用。

在PowerShell中,[Environment] :: SetEnvironmentVariable命令。


SETX似乎仅在Windows XP SP2上可用
Arthur

2
它适用于Windows 7。您正在使用哪个版本的Windows?
维克·大卫

@jules:然后可以从资源工具包中获取它。
乔伊(Joey)

45
使用SETX时要小心,它会将您的可变长度截断为1024个字符...在操作%path%时非常危险。
EtienneDesgagné13年

2
使用Power Shell可以[Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine"),请参见msdn.microsoft.com/zh-cn/library/96xafkes(v=vs.110).aspx
渐变

21

有关环境变量MSDN文档告诉您该怎么做:

若要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment注册表项中,然后广播将lParam设置为字符串“ Environment” 的WM_SETTINGCHANGE消息。这样,外壳程序之类的应用程序就可以获取您的更新。

您当然需要管理员权限才能执行此操作。我不知道从Windows批处理中广播Windows消息的方法,因此您需要编写一个小程序来执行此操作。


1
好的,因此考虑您的解决方案,我创建了一个注册表(.reg)文件,其中包含要添加/更改的环境变量。然后,我将在所有目标PC上运行此文件。我真的不需要发送Windows消息,因为我将重新启动会受到影响的应用程序。谢谢。
亚瑟

1
我在这里添加您的其他答案,因为这正是我偶然发现此问题时正在寻找的东西:stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck 2015年

1
@David,那么为什么不setx下面呢?
佩里耶

我认为此reg的优点是不会被截断并且不会成为
Powershell

2
' SetVar.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

21
您应该考虑在代码中添加一些上下文或说明。
adamdunson

1
强大的代码片段+1。在XP上无法使用setx(并且无法安装)。简单使用(就我而言):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
由于没有人遇到麻烦,因此可以在XP上使用(不需要Resource Kit或setx),为所有(其他)DOS窗口完成{set foo = bar}:1.将上述代码另存为SetVar.vbs。2. setvar。 vbs set system foo“ bar”注意,当前的 DOS窗口无法从中获取FOO。问题集foo = bar实现了这一目标
MicrosoftShouldBeKickedInNuts

2
另请注意,此操作在重新启动后仍然有效(使用系统参数时)
MicrosoftShouldBeKickedInNuts

1

实际上,SET TEST_VARIABLE = value仅适用于当前过程,因此SETX是必需的。在用户级别永久存储环境变量的快速示例。

  1. 以cmd为单位SETX TEST_VARIABLE etc尚未应用(echo %TEST_VARIABLE%显示%TEST_VARIABLE%
  2. 快速检查:打开cmd,echo %TEST_VARIABLE%显示etc
  3. GUI检查:系统属性->高级->环境变量->用户变量->您应该看到带有value的可变TEST_VARIABLE etc

0
:: 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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.