我必须在不同的Windows机器上设置环境变量,但是我不想因为进入“我的电脑”的属性屏幕而手动更改它们
我想使用批处理文件从命令行执行此操作。据我了解,使用set只会更改我将在命令窗口中调用的进程的变量。
我想绝对设置它,因此以后,在运行新进程时,它将使用我设置的那些新设置。有没有办法从命令行执行此操作?
我必须在不同的Windows机器上设置环境变量,但是我不想因为进入“我的电脑”的属性屏幕而手动更改它们
我想使用批处理文件从命令行执行此操作。据我了解,使用set只会更改我将在命令窗口中调用的进程的变量。
我想绝对设置它,因此以后,在运行新进程时,它将使用我设置的那些新设置。有没有办法从命令行执行此操作?
Answers:
使用SETX命令(注意后缀“ x”)来设置在cmd窗口关闭后仍保留的变量。
例如,设置一个值为“ bar”的环境变量“ foo”:
setx foo bar
尽管值得一读的是打印用法(setx /?
)时显示的“注释”,尤其是:
2)在本地系统上,此工具创建或修改的变量将在以后的命令窗口中可用,但在当前的CMD.exe命令窗口中不可用。
3)在远程系统上,此工具创建或修改的变量将在下一次登录会话时可用。
在PowerShell中,[Environment] :: SetEnvironmentVariable命令。
[Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")
,请参见msdn.microsoft.com/zh-cn/library/96xafkes(v=vs.110).aspx
若要以编程方式添加或修改系统环境变量,请将它们添加到HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment注册表项中,然后广播将lParam设置为字符串“ Environment” 的WM_SETTINGCHANGE消息。这样,外壳程序之类的应用程序就可以获取您的更新。
您当然需要管理员权限才能执行此操作。我不知道从Windows批处理中广播Windows消息的方法,因此您需要编写一个小程序来执行此操作。
setx
下面呢?
' 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
setx
(并且无法安装)。简单使用(就我而言):wsh.Environment("user").Item("myVar") = "my value"
:: 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'