コマンドラインを使用して、システムのPATH変数に永続的にエントリを追加するにはどうすればよいですか?


13

私は何をする必要がありますか:

  • %PATH%SYSTEMレベルで環境変数にフォルダーを追加します。
  • 変更を永続的にします。

私がそれをする方法:

  • コマンドプロンプト、または必要なすべてのコマンド.BATファイルに書き込むことができる別の方法を使用します。
  • インターネットに接続せずに、Windows XP SP3のベアインストールで利用可能なツールのみを使用します。
  • スクリプトをローカルで実行したいのですが、ターゲットシステムへのリモートアクセスもあります。ただし、システムでデフォルト以外のサービス(リモートレジストリなど)が有効になっているとは想定できません。

スクリプトが動作する必要があるシステム:

  • Windows XP SP3
  • Windows Server 2003 SP2
  • Windows 7 SP1
  • Windows Server 2008 R2 SP1

私はこのSETコマンドにかなり精通していますが、通常、既存の変数に追加するのではなく、既存の変数を上書きすることも知っています。それは受け入れられません。SET代わりに変数に追加する別のツール(または、私が知らないオプション)がありますか?または、既存の変数を別の変数またはテキストファイルに一時的にコピーすることを含む回避策をスクリプトに入れる必要がありますか?

また、変数を永続的に変更しSETないのは私の理解です。の言及を見てきましたが、それはWindows XP SP3に組み込まれているようには見えません(少なくとも、作業中のシステムでは使用できないようです)。レジストリの編集などによって、変更を永続的にする別の方法はありますか?SETX

私はいくつかの辺りを見回しましたが、ここでWindowsでの環境変数の設定について少し学びました。しかし、私は自分のニーズに合った正確に重複した質問をまだ見つけていません。ある場合は、教えてください。


SetxにはXPが付属していません。これは1つ以上のリソースキットに含まれていますが、どれがオフハンドであるかを忘れています。コマンドラインで永続的な環境変数を変更するには、間違いなく最も簡単な方法です。レジストリ(HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment)で変更を加えることはできますが、コマンドラインからのレジストリの変更も簡単ではありません。私があなたなら、これを行うためにVBScriptを作成します。
EBGreen

@EBGreen REGレジストリの変更を行うのに少し慣れています。既存のパスを保持する方法についての提案とともに、それを回答として投稿したい場合は、少なくともそれに賛成票を投じます。
イスジ

1
EBGreenの提案に従って、私はそれをどのように行う必要があるかを理解したと思います。今、私はちょうどエクスプローラを再起動または再ロードせずにレジストリを更新する(および環境変数にプッシュする)方法があればいいのに?
イスジ

1
@EBGreenうん、それはそれがどのように見えるかです。ところで、構文を理解する時間があれば、実際の答えを投稿してください。むしろこれは自己回答の質問にはなりません。
イスジ

1
@lszi、あなたはあなた自身の質問に答えるべきです。良い質問に対する良い答えは、あなたが自分で答えたとしても、両方とも貴重です。
マーディンエムリス

回答:


4

以下は、パスに「C:\ bin」を追加し、新しいパスをレジストリに保存します。

set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %path% /f

これはXP SP3でのみテストしましたが、新しいバージョンでも動作するはずです。

マシンがリブートする前にログオンする新しいユーザーが新しいパスを取得できない可能性があります。

Harryは%SystemRoot%についての彼のコメントで正しいです。これらを保持する場合は、最初にレジストリからパスの古い値を取得する必要があります。

@echo OFF

set KEY_NAME="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
set VALUE_NAME=Path

FOR /F "usebackq skip=4 tokens=1-3" %%A IN (`REG QUERY %KEY_NAME% /v %VALUE_NAME% 2^>nul`) DO (
  set ValueName=%%A
  set ValueValue=%%C
)

if defined ValueName (

  set newPath=%ValueValue%;C:\bin

  reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d %newPath% /f

  set path=%path%;C:\bin

) else (
    @echo %KEY_NAME%\%VALUE_NAME% not found.
)

2
これにより、環境変数の参照が展開され、既存のPATHエントリの一部が変更されることに注意してください。たとえば、標準エントリ%SystemRoot%\ system32はc:\ windows \ system32に置き換えられます。SystemRootは定数であるため、この特定の例は重要ではありませんが、誰かが変更する環境変数への参照を使用してPATHを設定した場合、それは壊れます。(現在のSun JDKのbinディレクトリを指すように、一部のコンピューターでこれを行います。)
ハリージョンストン

パスに角かっこ、たとえばProgram Files(x86)への参照が含まれる場合、新しいスクリプトは記述どおりに機能しません。
ハリージョンストン

-1
set path=%path%;C:\bin
reg.exe ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /t REG_EXPAND_SZ /d ^%path^% /f

2
裸のコマンドは便利ですが、質問/回答ではもう少し作業が必要です。これがOPの質問にどのように答えるかを説明してください。
Ƭᴇcʜιᴇ007
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.