web-dev-qa-db-de.com

Legen Sie eine permanente Umgebungsvariable aus cmd.exe fest

Ich muss Umgebungsvariablen auf verschiedenen Windows-Computern festlegen, möchte mich aber nicht darum kümmern, sie manuell zu ändern, indem ich auf den Eigenschaftenbildschirm von "Arbeitsplatz" gehe.

Ich möchte es von der Kommandozeile aus mit einer Batch-Datei machen. Soweit ich weiß, ändert set nur die Variable für die Prozesse, die ich im Befehlsfenster aufrufe.

Ich möchte es definitiv festlegen, damit später, wenn ein neuer Prozess ausgeführt wird, die neuen Einstellungen verwendet werden, die ich festgelegt habe. Gibt es eine Möglichkeit, dies von der Befehlszeile aus zu tun?

104
Arthur

Verwenden Sie den Befehl SETX (beachten Sie das Suffix 'x'), um Variablen festzulegen, die nach dem Schließen des cmd-Fensters bestehen bleiben.

Es lohnt sich jedoch, die 'Notizen' zu lesen, die angezeigt werden, wenn Sie die Verwendung drucken (setx /?), bestimmtes:

2) Auf einem lokalen System sind mit diesem Tool erstellte oder geänderte Variablen in zukünftigen Befehlsfenstern verfügbar, jedoch nicht im aktuellen CMD.exe-Befehlsfenster.

3) Auf einem Remote-System stehen die mit diesem Tool erstellten oder geänderten Variablen bei der nächsten Anmeldesitzung zur Verfügung.

In PowerShell der Befehl [Environment] :: SetEnvironmentVariable .

160
Vik David

In der MSDN-Dokumentation für Umgebungsvariablen erfahren Sie, was zu tun ist:

Um Systemumgebungsvariablen programmgesteuert hinzuzufügen oder zu ändern, fügen Sie sie dem Registrierungsschlüssel HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment hinzu, und senden Sie dann einen Broadcast WM_SETTINGCHANGE Nachricht mit lParam auf den String "Environment" gesetzt. Auf diese Weise können Anwendungen wie die Shell Ihre Aktualisierungen abrufen.

Dazu benötigen Sie natürlich Administratorrechte. Ich kenne keine Möglichkeit, eine Windows-Nachricht vom Windows-Stapel zu senden, daher müssen Sie ein kleines Programm schreiben, um dies zu tun.

18
David Heffernan
' 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
2
Justin Peal
:: 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'
0
gseattle

Tatsächlich funktioniert SET TEST_VARIABLE = value nur für den aktuellen Prozess, daher ist SETX erforderlich. Ein kurzes Beispiel für das dauerhafte Speichern einer Umgebungsvariablen auf Benutzerebene.

  1. In cmd, SETX TEST_VARIABLE etc. Noch nicht angewendet (echo %TEST_VARIABLE% zeigt an %TEST_VARIABLE%,
  2. Schnellcheck: Öffne cmd, echo %TEST_VARIABLE% zeigt etc.
  3. GUI-Prüfung: Systemeigenschaften -> Erweitert -> Umgebungsvariablen -> Benutzervariablen für -> Sie sollten Varible TEST_VARIABLE mit dem Wert etc sehen.
0
Alexei