ตั้งค่าตัวแปรสภาพแวดล้อมถาวรจาก cmd.exe


123

ฉันต้องตั้งค่าตัวแปรสภาพแวดล้อมในเครื่อง windows ต่างๆ แต่ฉันไม่อยากยุ่งยากในการเปลี่ยนด้วยตนเองโดยไปที่หน้าจอคุณสมบัติของ "My Computer"

ฉันต้องการทำจากบรรทัดคำสั่งด้วยไฟล์แบตช์ เท่าที่ฉันเข้าใจการใช้ set จะเปลี่ยนตัวแปรสำหรับกระบวนการที่ฉันจะเรียกในหน้าต่างคำสั่งเท่านั้น

ฉันต้องการตั้งค่าอย่างแน่นอนดังนั้นในภายหลังเมื่อเรียกใช้กระบวนการใหม่จะใช้การตั้งค่าใหม่ที่ฉันตั้งไว้ มีวิธีดำเนินการจากบรรทัดคำสั่งหรือไม่?


อะไรคือจุดเริ่มต้นของการตั้งค่าจากบรรทัดคำสั่งถ้าพวกเขาจะถาวร? คุณไม่จำเป็นต้องทำอีก
d-live

12
ใช่ แต่ฉันต้องทำบนคอมพิวเตอร์หลายเครื่องดังนั้นการเรียกใช้สคริปต์จะช่วยประหยัดเวลาได้
Arthur

2
ในกรณีนี้คุณสามารถตั้งค่า env ของคุณบนคอมพิวเตอร์เครื่องหนึ่งและทำการส่งออกรายการที่อธิบายด้านล่างและมีไฟล์. reg หากคุณไม่สามารถใช้ SETX ได้
d-live

นั่นคือสิ่งที่ฉันทำ ขอบคุณ
Arthur

1
RE: 'อะไรคือจุดเริ่มต้นของการตั้งค่าจากบรรทัดคำสั่ง ... ' ที่ฉันทำงานมีข้อกำหนดคงที่สำหรับตัวแปรสภาพแวดล้อมที่คงอยู่จำนวนมากตามค่าที่แตกต่างกันเพื่อทดสอบ / พัฒนาซอฟต์แวร์เวอร์ชันต่างๆ การออกใบอนุญาตหมายความว่าไม่สามารถทำได้ด้วยวิธีอื่น (เช่นการเรียกใช้ VM) ดังนั้นทางเลือกเดียวของเราคือการใช้ SETX ในชุดสคริปต์ การใช้. reg นั้นดีน้อยกว่าเนื่องจากยากในการจัดทำเอกสาร / ดูว่าเกิดอะไรขึ้น
Tony Eastwood

คำตอบ:


189

ใช้คำสั่ง SETX (สังเกตคำต่อท้าย 'x') เพื่อตั้งค่าตัวแปรที่ยังคงมีอยู่หลังจากปิดหน้าต่าง cmd แล้ว

ตัวอย่างเช่นในการตั้งค่า env var "foo" ด้วยค่า "bar":

setx foo bar

แม้ว่าการอ่าน 'บันทึกย่อ' จะคุ้มค่าหากคุณพิมพ์การใช้งาน ( setx /?) โดยเฉพาะอย่างยิ่ง:

2) ในระบบโลคัลตัวแปรที่สร้างหรือแก้ไขโดยเครื่องมือนี้จะพร้อมใช้งานในหน้าต่างคำสั่งในอนาคต แต่จะไม่มีในหน้าต่างคำสั่ง CMD.exe ปัจจุบัน

3) บนระบบรีโมตตัวแปรที่สร้างหรือแก้ไขโดยเครื่องมือนี้จะพร้อมใช้งานในเซสชันการเข้าสู่ระบบถัดไป

ใน PowerShell คำสั่ง[Environment] :: SetEnvironmentVariable


ดูเหมือนว่า SETX จะมีเฉพาะบน windows XP SP2
Arthur

2
มันทำงานบน Windows 7 สำหรับฉัน คุณกำลังใช้ Windows เวอร์ชันใด
Vik David

@jules: คุณสามารถหาได้จาก Resource Kit จากนั้น
Joey

46
ดูแลด้วย SETX มันจะตัดทอนความยาวตัวแปรของคุณเป็น 1024 ตัวอักษร ... อันตรายมากเมื่อจัดการกับ% path%
Etienne Desgagné

2
ด้วย Power Shell คุณสามารถ[Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")ดูที่msdn.microsoft.com/en-us/library/96xafkes(v=vs.110).aspx
Gradient

21

MSDN เอกสารสำหรับตัวแปรสภาพแวดล้อมที่จะบอกคุณว่าจะทำอย่างไร:

หากต้องการเพิ่มหรือแก้ไขตัวแปรสภาพแวดล้อมระบบโดยทางโปรแกรมให้เพิ่มลงในคีย์รีจิสทรีHKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environmentจากนั้นออกอากาศข้อความWM_SETTINGCHANGEโดยมี lParam ตั้งค่าเป็นสตริง "Environment" ซึ่งช่วยให้แอปพลิเคชันเช่นเชลล์สามารถรับการอัปเดตของคุณได้

คุณจะต้องมีสิทธิ์ของผู้ดูแลระบบในการดำเนินการนี้ ฉันรู้วิธีถ่ายทอดข้อความ windows จาก Windows batch ไม่ได้ดังนั้นคุณจะต้องเขียนโปรแกรมเล็ก ๆ เพื่อทำสิ่งนี้


1
ตกลงดังนั้นเมื่อพิจารณาวิธีแก้ปัญหาของคุณฉันได้สร้างไฟล์รีจิสทรี (.reg) ที่มีตัวแปรสภาพแวดล้อมที่ฉันต้องการเพิ่ม / เปลี่ยนแปลง จากนั้นฉันจะเรียกใช้ไฟล์นี้บนพีซีเป้าหมายทั้งหมด ฉันไม่จำเป็นต้องส่งข้อความ windows เพราะฉันจะรีสตาร์ทแอปพลิเคชันที่จะได้รับผลกระทบ ขอบคุณ
Arthur

1
ฉันกำลังเพิ่มคำตอบอื่นของคุณที่นี่เนื่องจากเป็นสิ่งที่ฉันกำลังมองหาเมื่อฉันสะดุดกับคำถามนี้: stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@ เดวิดทำไมไม่ดูsetxด้านล่าง?
Pacerier

ฉันคิดว่า reg นี้มีข้อดีคือไม่ตัดทอนและไม่เป็น powershell
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
คุณควรพิจารณาเพิ่มบริบทหรือคำอธิบายประกอบโค้ดของคุณ
adamdunson

1
รหัสที่มีประสิทธิภาพ +1 ทำงานบน XP โดยไม่ต้องsetx(และไม่มีความเป็นไปได้ที่จะติดตั้ง) ใช้งานง่าย (ในกรณีของฉัน):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
เนื่องจากไม่มีใครประสบปัญหาในการใช้งานบน XP (ไม่ต้องใช้ Resource Kit หรือ setx) เพื่อบรรลุ {set foo = bar} สำหรับหน้าต่าง DOS ทั้งหมด (อื่น ๆ ): 1. บันทึกโค้ดด้านบนเป็น SetVar.vbs 2. setvar vbs ตั้งค่าระบบ foo "bar" หมายเหตุหน้าต่าง DOS ปัจจุบันไม่ได้รับ FOO จากสิ่งนี้ ปัญหาตั้งค่า foo = bar เพื่อให้บรรลุ
MicrosoftShouldBeKickedInNuts

2
โปรดทราบว่าสิ่งนี้จะยังคงอยู่ในการรีบูต (เมื่อคุณใช้ระบบ parm)
MicrosoftShouldBeKickedInNuts

1

แน่นอน SET TEST_VARIABLE = ค่าใช้ได้กับกระบวนการปัจจุบันเท่านั้นดังนั้นจึงSETXจำเป็น ตัวอย่างรวดเร็วสำหรับการจัดเก็บตัวแปรสภาพแวดล้อมอย่างถาวรที่ระดับผู้ใช้

  1. ใน cmd SETX TEST_VARIABLE etcในคำสั่งยังไม่สมัคร ( echo %TEST_VARIABLE%รายการ%TEST_VARIABLE%,
  2. ตรวจสอบอย่างรวดเร็ว: เปิดคำสั่งแสดงให้เห็นว่าecho %TEST_VARIABLE%etc
  3. ตรวจสอบ GUI: System Properties -> Advanced -> ตัวแปรสภาพแวดล้อม -> ตัวแปรของผู้ใช้สำหรับ -> คุณจะเห็น varible 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'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.