Đặt một biến môi trường liên tục từ cmd.exe


123

Tôi phải đặt các biến môi trường trên các máy windows khác nhau, nhưng tôi không muốn bị làm phiền khi thay đổi chúng theo cách thủ công bằng cách vào màn hình thuộc tính của "Máy tính của tôi"

Tôi muốn làm điều đó từ dòng lệnh, với một tệp hàng loạt. Theo như tôi hiểu, việc sử dụng set sẽ chỉ thay đổi biến cho các quy trình mà tôi sẽ gọi trong cửa sổ lệnh.

Tôi muốn đặt nó chắc chắn, vì vậy sau này, khi chạy một quy trình mới, nó sẽ sử dụng những cài đặt mới mà tôi đã đặt. Có cách nào để làm điều đó từ dòng lệnh không?


Mục đích của việc đặt chúng từ dòng lệnh nếu chúng hoạt động vĩnh viễn là gì? Bạn sẽ không cần phải làm lại.
d-live

12
Có, nhưng tôi phải thực hiện trên nhiều máy tính, vì vậy việc chạy tập lệnh sẽ giúp tôi tiết kiệm thời gian.
Arthur

2
Được rồi, trong trường hợp đó, bạn có thể đặt env của mình trên một máy tính và thực hiện xuất các mục nhập được mô tả bên dưới và có tệp .reg, nếu SETX không khả dụng với bạn.
d-live

Đó là những gì tôi đã làm. Cảm ơn.
Arthur

1
RE: 'Điểm đặt chúng từ dòng lệnh là gì ...' Ở nơi tôi làm việc, có một yêu cầu liên tục đối với một số biến môi trường liên tục với các giá trị khác nhau để kiểm tra / phát triển các phiên bản khác nhau của phần mềm. Việc cấp phép có nghĩa là nó không thể được thực hiện theo bất kỳ cách nào khác (ví dụ: chạy một máy ảo) vì vậy cách duy nhất của chúng tôi là sử dụng SETX trong một tập lệnh lô. Sử dụng .reg được ít tốt như khó khăn hơn để tài liệu / xem chính xác những gì đang xảy ra
Tony Eastwood

Câu trả lời:


189

Sử dụng lệnh SETX (lưu ý hậu tố 'x') để đặt các biến vẫn tồn tại sau khi cửa sổ cmd được đóng.

Ví dụ: để đặt một env var "foo" có giá trị là "bar":

setx foo bar

Mặc dù bạn nên đọc 'ghi chú' được hiển thị nếu bạn in cách sử dụng ( setx /?), cụ thể là:

2) Trên hệ thống cục bộ, các biến được tạo hoặc sửa đổi bởi công cụ này sẽ có sẵn trong các cửa sổ lệnh trong tương lai nhưng không có trong cửa sổ lệnh CMD.exe hiện tại.

3) Trên hệ thống từ xa, các biến được tạo hoặc sửa đổi bởi công cụ này sẽ có sẵn trong phiên đăng nhập tiếp theo.

Trong PowerShell, lệnh [Môi trường] :: SetEnosystemVariable .


Có vẻ như SETX chỉ khả dụng trên windows XP SP2
Arthur

2
Nó hoạt động trên Windows 7 đối với tôi. Bạn đang sử dụng phiên bản Windows nào?
Vik David

@jules: Sau đó, bạn có thể lấy nó từ Bộ tài nguyên.
Joey

46
Cẩn thận với SETX, nó cắt ngắn biến độ dài của bạn thành 1024 ký tự ... rất nguy hiểm khi thao tác với% path%.
Etienne Desgagné

2
với Power Shell bạn có thể chỉ cần [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")xem msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient

21

Các tài liệu MSDN cho các biến môi trường cho bạn biết phải làm gì:

Để thêm hoặc sửa đổi các biến môi trường hệ thống theo chương trình, hãy thêm chúng vào khóa đăng ký HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment , sau đó phát thông báo WM_SETTINGCHANGE với lParam được đặt thành chuỗi "Môi trường". Điều này cho phép các ứng dụng, chẳng hạn như shell, nhận các bản cập nhật của bạn.

Tất nhiên bạn sẽ cần quyền quản trị để làm điều này. Tôi không biết không có cách nào để phát thông báo windows từ hàng loạt Windows, vì vậy bạn sẽ cần viết một chương trình nhỏ để thực hiện việc này.


1
Được rồi, vì vậy hãy xem xét giải pháp của bạn, tôi đã tạo tệp đăng ký (.reg) có chứa các biến môi trường mà tôi muốn thêm / thay đổi. Sau đó, tôi sẽ chạy tệp này trên tất cả các PC mục tiêu. Tôi không thực sự cần gửi tin nhắn windows, vì tôi sẽ chỉ khởi động lại ứng dụng sẽ bị ảnh hưởng. Cảm ơn.
Arthur

1
Tôi thêm câu trả lời khác của bạn ở đây, vì nó là chính xác những gì tôi đang tìm kiếm khi tôi stumbled khi câu hỏi này: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@David, Vậy tại sao không setxở bên dưới?
Pacerier

Tôi nghĩ rằng reg này có lợi thế là không cắt bớt và không phải là quyền hạn
eri0o

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
Bạn nên xem xét thêm một số ngữ cảnh hoặc giải thích để đi kèm với mã của bạn.
adamdunson

1
Đoạn mã mạnh mẽ +1. Hoạt động trên XP mà không cần setx(và không có khả năng cài đặt nó). Sử dụng đơn giản (trong trường hợp của tôi):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
Vì không ai gặp khó khăn nên để sử dụng trên XP (không cần Resource Kit hoặc setx), để thực hiện {set foo = bar} cho tất cả (khác) cửa sổ DOS: 1. lưu mã trên dưới dạng SetVar.vbs 2. setvar. vbs set system foo "bar" Lưu ý, cửa sổ DOS hiện tại không nhận được FOO từ điều này. Vấn đề đặt foo = bar để đạt được điều đó
MicrosoftShouldBeKickedInNuts

2
Cũng lưu ý, sống sót reboot này (khi bạn sử dụng parm hệ thống)
MicrosoftShouldBeKickedInNuts

1

Thật vậy SET TEST_VARIABLE = giá trị chỉ hoạt động cho quá trình hiện tại, vì vậy SETXlà bắt buộc. Một ví dụ nhanh để lưu trữ vĩnh viễn một biến môi trường ở cấp người dùng.

  1. Trong cmd , SETX TEST_VARIABLE etc. Chưa được áp dụng ( echo %TEST_VARIABLE%hiển thị %TEST_VARIABLE%,
  2. Kiểm tra nhanh: mở cmd, echo %TEST_VARIABLE%hiển thịetc .
  3. Kiểm tra GUI: Thuộc tính hệ thống -> Nâng cao -> Biến môi trường -> Biến người dùng cho -> bạn sẽ thấy Biến TEST_VARIABLE có giá trị 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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.