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


123

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

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

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


それらが永続的になる場合、コマンドラインからそれらを設定する意味は何ですか?もう一度行う必要はありません。
d-live

12
はい、ただし複数のコンピューターで実行する必要があるため、スクリプトを実行すると時間を節約できます。
アーサー

2
その場合、SETXを使用できない場合は、1台のコンピューターに環境変数を設定し、以下で説明するエントリをエクスポートして、.regファイルを作成できます。
d-live

それは私がやったことです。ありがとう。
アーサー

1
RE:「コマンドラインから設定するポイントは...」私が作業している場所では、ソフトウェアの異なるバージョンをテスト/開発するために、さまざまな値に対するいくつかの永続的な環境変数が常に必要です。ライセンスとは、他の方法(VMの実行など)では実行できないことを意味するため、私たちの唯一の手段はバッチスクリプトでSETXを使用することです。.regの使用は、何が起こっているのかを正確に文書化/確認することが難しいため、あまり良い方法ではありません
Tony Eastwood

回答:


189

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

たとえば、env変数「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:リソースキットから入手できます。
ジョーイ、

45
SETXに注意してください。可変長が1024文字に切り捨てられます...%path%を操作する場合は非常に危険です。
EtienneDesgagné2013

2
Power Shell [Environment]::SetEnvironmentVariable('PATH', "Whatever you need it to be", "Machine")では、次のことができます。msdn.microsoft.com
Gradient

21

環境変数のMSDNのドキュメントには何をすべきかを説明します:

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

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


1
さて、あなたの解決策を考慮して、追加/変更したい環境変数を含むレジストリ(.reg)ファイルを作成しました。次に、このファイルをすべてのターゲットPCで実行します。影響を受けるアプリケーションを再起動するだけなので、Windowsメッセージを送信する必要はありません。ありがとう。
アーサー

1
それは私がこの質問につまずいたときに私が探していたまさにだった私は、ここにあなたの他の答えを追加している:stackoverflow.com/a/19705691/3543437
kayleeFrye_onDeck

1
@David、それではなぜsetx下ではないのですか?
パセリエ2017

この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 2013

1
強力なコード+1。XPで動作しますsetx(インストールする必要はありません)。簡単な使用(私の場合):wsh.Environment("user").Item("myVar") = "my value"
Marek

2
誰も問題を抱えていないので、XP(リソースキットまたはsetxは不要)で使用し、すべての(その他の)DOSウィンドウで{set foo = bar}を実行します。1.上記のコードをSetVar.vbsとして保存します2. setvar。 vbs set system foo "bar"注意、現在の DOSウィンドウはこれからFOOを取得しません。それを達成するためにset foo = barを発行します
MicrosoftShouldBeKickedInNuts

2
また、これは再起動後も存続します(システムパラメーターを使用する場合)
MicrosoftShouldBeKickedInNuts

1

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

  1. CMDで、SETX TEST_VARIABLE etcまだ適用されていません(echo %TEST_VARIABLE%番組%TEST_VARIABLE%
  2. クイックチェック:cmdを開くとecho %TEST_VARIABLE%表示されますetc
  3. GUIチェック:システムのプロパティ->詳細設定->環境変数->ユーザー変数->変数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.