web-dev-qa-db-ja.com

cmd.exeから永続的な環境変数を設定します

さまざまなWindowsマシンで環境変数を設定する必要がありますが、「マイコンピュータ」のプロパティ画面にアクセスして手動で変更する必要はありません。

バッチファイルを使用して、コマンドラインから実行します。私の知る限り、setを使用しても、コマンドウィンドウで呼び出すプロセスの変数のみが変更されます。

絶対に設定したいので、後で新しいプロセスを実行するときに、設定した新しい設定を使用します。コマンドラインからそれを行う方法はありますか?

104
Arthur

SETXコマンド (接尾辞「x」に注意)を使用して、cmdウィンドウが閉じられた後も持続する変数を設定します。

使用法(setx /?)を印刷する場合に表示される「メモ」を読む価値はありますが、特に:

2)ローカルシステムでは、このツールによって作成または変更された変数は、今後のコマンドウィンドウで使用できますが、現在のCMD.exeコマンドウィンドウでは使用できません。

3)リモートシステムでは、このツールによって作成または変更された変数は、次回のログオンセッションで使用可能になります。

PowerShellでは、 [Environment] :: SetEnvironmentVariable コマンド。

160
Vik David

環境変数のMSDNドキュメント は何をすべきかを示しています:

プログラムでシステム環境変数を追加または変更するには、それらをHKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environmentレジストリキーに追加してから、文字列「Environment」に設定されたlParamを持つWM_SETTINGCHANGEメッセージ。これにより、シェルなどのアプリケーションが更新を取得できます。

もちろん、これを行うには管理者権限が必要です。 WindowsバッチからWindowsメッセージをブロードキャストする方法がないので、これを行うには小さなプログラムを作成する必要があります。

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

実際、SET TEST_VARIABLE = valueは現在のプロセスでのみ機能するため、SETXが必要です。ユーザーレベルで環境変数を永続的に保存する簡単な例。

  1. cmdで、SETX TEST_VARIABLE etcまだ適用されていません(echo %TEST_VARIABLE%%TEST_VARIABLE%を示します、
  2. クイックチェック:cmdを開く、echo %TEST_VARIABLE%etcを表示します。
  3. GUIチェック:システムプロパティ->詳細->環境変数->ユーザー変数->値etcの変数TEST_VARIABLEが表示されます。
0
Alexei