Windowsで環境変数を編集するために使用できるコマンドラインツールはありますか?
これがスマートツールであるとしたら、次のようになります。
そして最後になりましたが、少なくとも-セッション間で変更を保持したいので、単純なSETは問題外です...
Path Editor と呼ばれるこのための非常に優れたGUIツールがあり、コマンドライン用にこのようなものが必要です。
Windows Server 2003 Resource KitToolsのPathManager(pathman.exe)は、私が見つけた最も近いものです。 NTリソースキットですでに利用可能でした。
これを行うツールはわかりませんが、reg
コマンドを使用できるかもしれません。
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path
現在のパスを読み取るには、
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path /d "newPath" /f
あなたの新しい価値を書くために。
HKLMで権利アクセスを取得するには管理者権限が必要です。それが問題になる場合は、代わりにHKCU\Environment
のユーザー固有のパス設定を変更することを検討してください。
環境変数を設定して変更を永続化する一般的な方法が必要な場合は、 setx.exe が使用するツールになります。しかし、それはあなたが求めている「賢い」ことをすることはできません...
setx.exeはWindowsVista以降に含まれています。以前のバージョンのWindowsを使用している場合は、上記のダウンロードリンクを使用して入手できます。
現在のプログラムには、path
があります。
実行可能ファイルの検索パスを表示または設定します。
PATH [[drive:]path[;...][;%PATH%] PATH ;
PATH ;
と入力してすべての検索パス設定をクリアし、cmd.exe
に現在のディレクトリのみを検索するように指示します。パラメータなしで
PATH
と入力して、現在のパスを表示します。新しいパス設定に%PATH%
を含めると、古いパスが新しい設定に追加されます。
ただし、これはset PATH
とほとんど同じです。
環境変数を永続化するには、レジストリを編集するか、setx
を使用する必要があります。
ユーザーが昇格された特権なしで環境変数編集ダイアログを実行できるようにする機能を発見しました。
[スタート]メニューから、次を実行します。
rundll32 sysdm.cpl,EditEnvironmentVariables
Gtoolsコレクションのパスを確認することをお勧めします: http://www.p-nand-q.com/gtools.html
これは、次のようなコマンドプロンプトに一連のコマンドを提供します。
pathed /APPEND %CD% /USER
たとえば、現在のパスを追加します。私はGUIを使用してもまったく問題がないので、正直に言って実際にはチェックアウトしていません。
その他のオプションは次のとおりです。
/MACHINE: print machine PATH
/USER: print user PATH
/ADD: add variable at the head
/APPEND: add variable at the tail
/REMOVE: remove path / index
/SLIM: strip duplicate vars
/ENV: environment variable, defaults to PATH
同じコレクションのどれと一緒に、あなたはあなた自身にいくつかの良いツールを手に入れたと思います。これは「実行可能ファイルをPATHに配置する」ものです。
/EXTENSION: search for extension , can be a ; separated list
/DIR: add directory , can be a ; separated list
/RECURSIVE: search directories recursively
/SINGLE: stop after the first find result
/ENV: environment variable, defaults to PATH
FILE {FILE}: one or more files to find
パスを設定する
(ヘルプセット)
このためのバッチスクリプトのセットを作成しました。 addpath.batはパスに要素を追加し、rmpath.batはパスから要素を削除し、lpath.batはパスをリストするだけです。しかし、その後、いくつかのサポートスクリプトが必要だったので、chkpath.batもあります。
それは些細なことではなく、tr.exeとcat.exe、いくつかのunixスタイルのユーティリティが必要でした。些細なことではない理由:cmd.exeにバッククォートがない(これにはforループを使用できますが)、短い名前と長い名前。
addpath.bat:
@echo off
setlocal
set cwd=%~dps0
goto testit
:loopy
call %cwd%chkpath "%~1"
if %errorlevel%==2 (
set path=%path%;%~1
)
shift
:testit
if not _%1==_ goto loopy
call %cwd%lpath.bat
endlocal & set path=%path%
ChkPath.bat:
@echo off
goto START
-------------------------------------------------------
chkpath.bat
checks path for existence of the given segment.
Returns 1 if present, 2 if not present, 0 if not checked.
The matching and checking complicated by case sensitivity and "short pathnames".
created sometime in 2003 and lovingly maintained since then.
-------------------------------------------------------
:START
setlocal enabledelayedExpansion
set rc=0
set cwd=%~dps0
set curdrive=%~d0
set tr=%curdrive%\bin\tr.exe
set regexe=%windir%\system32\reg.exe
if _%1==_ goto Usage
@REM convert arg 1 to a fully-qualified, short path name,
@REM and then convert to uppercase.
set toupper=%~fs1
call :ToUpper
set tocheck=%toupper%
if not _%TEMP%==_ goto GotTemp
call :gettemp
:GotTemp
set d=%DATE:~4%
set stamp=%d:~6%%d:~3,2%%d:~0,2%%TIME::=%
set d=
set tempfile1=%TEMP%\chkpath1-%stamp%.tmp
echo %path% | %tr% ; \n > %tempfile1%
@REM check each element in the path for the match:
for /f "delims=^" %%I in (%tempfile1%) do (
if !rc!==0 (
call :CheckElt "%%I"
)
)
if %rc%==0 set rc=2
goto END
--------------------------------------------
* checkelt
*
* check one element in the path to see if it is the same
* as the TOCHECK string. The element is first canonicalized.
*
:CheckElt
@REM remove surrounding quotes
set ERF=%1
if [x%ERF%]==[x] goto CheckEltDone
@REM convert to fully-qualified, short paths, uppercase
set TOUPPER=%~fs1%
call :ToUpper
if _%TOCHECK% == _%TOUPPER% set rc=1
:CheckEltDone
goto:EOF
--------------------------------------------
--------------------------------------------
* backtick
*
* invoke a command and return the result as a string.
* This is like backtick in csh or bash.
* To call, set variable BACKTICK to the command to be run.
* The result will be stored in the env variable of the same name.
*
:backtick
FOR /F "usebackq delims=" %%i IN (`%backtick%`) DO (
SET backtick=%%i
)
goto backtick_done
:backtick_none
SET backtick=nothing to exec
:backtick_done
goto:EOF
--------------------------------------------
--------------------------------------------
* gettemp
*
* get the temporary directory, as stored in the registry.
* Relies on backtick.
*
* The result set TEMP.
*
:gettemp
set regkey=HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
set regvalname=Local AppData
set backtick=%regexe% query "%regkey%" /v "%regvalname%"
call :backtick
for /f "tokens=4" %%a in ("%backtick%") do (
set temp=%%a
)
goto:EOF
--------------------------------------------
--------------------------------------------
* ToUpper
*
* Convert a string to all uppercase.
* To call, set variable TOUPPER to the thing to be converted.
* The result will be stored in the env variable of the same name.
*
:ToUpper
FOR /F "usebackq delims=" %%I IN (`echo %toupper% ^| %tr% a-z A-Z`) DO (
SET toupper=%%I
)
goto:EOF
--------------------------------------------
--------------------------------------------
:CleanUp
if _%tempfile1%==_ goto CleanUpDone
if exist %tempfile1% del %tempfile1%
:CleanUpDone
goto:EOF
--------------------------------------------
--------------------------------------------
:Usage
echo.
echo Usage: chkpath ^<path^>
echo checks if path element is included in path variable.
echo returns 1 if yes, 2 if no, 0 if not checked.
echo.
goto END
--------------------------------------------
:END
call :CleanUp
:ReallyEnd
endlocal & set errorlevel=%rc%
@REM set errorlevel=%rc%
@REM echo %errorlevel%
lpath.bat:
@echo.
@set curdrive=%~d0
@REM This form post-fixes a | at the end of each path element. Useful for debugging trailing spaces.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e s/PATH=// -e 's/;/^|\n/g' -e 's/$/^|/g'
@REM This form shows bare path elements.
@REM @path | %curdrive%\cygwin\bin\sed.exe -e 's/PATH=//' -e 's/;/^\n/g'
@path | %curdrive%\utils\sed -e "s/PATH=//" | %curdrive%\utils\tr ; \n
@echo.
ディレクトリが%PATH%に存在するかどうかを確認する方法は? スタックオーバーフローには 優れた説明 があります。これは、WindowsPATH編集とそれらを克服するためのバッチファイルを困難にするものです。 addpath.bat
の適切な使用方法を理解するには、呼び出し構造が初めてだったので少し練習が必要でしたが、これは機能します。
set _path=C:\new\directory\to\add\to\path
call addpath.bat _path
set _path=
また、繰り返し起動しても、新しいディレクトリがすでに存在する場合は追加されません。これは、編集をセッション間で永続化することには対応していません。