web-dev-qa-db-ja.com

バッチを介して%path%変数から不要なパス名を削除します

有効範囲:Windows XP以降のツール:バッチスクリプト

システムの%PATH%変数から不要なパス名を削除できるようにする必要があります。 SETX.EXEなどのツールを使用して、システムの%PATH%変数に新しいパス名を追加する方法を知っています。これにより、既存のCMD環境でもすぐに使用できるようになります。おそらくFINDや何らかのFORループを使用することの問題かもしれませんが、これをどのように達成するかはよくわかりません。以下にパスステートメントの例を示します...

%PATH% = C:\;C:\Program Files\Common Files\Java;C:\Oracle\product\10.2.0\bin;C:\WINDOWS;C:\WINDOWS\system32;

これから、「Oracle」に関連するフルパス名を削除できるようにする必要があります。したがって、上記の例では、上記のパスステートメントから「C:\ Oracle\product\10.2.0\bin」を削除できる必要があります。残念なことに、Oracleのパス名は上記のものと異なるだけでなく、複数のOracleのパス名が存在する可能性があり、すべて削除する必要があります。ここでソリューションを実装してみました...

環境変数PATHから完全なパスを抽出するにはどうすればよいですか?

ただし、機能していません。スクリプトはパス名を見つけられませんでした。任意の助けをいただければ幸いです。ありがとうございました。

22
user3208239

次のようなものを試すことができます:

@echo off&cls
setlocal EnableDelayedExpansion
set $line=%path%
set $line=%$line: =#%
set $line=%$line:;= %

for %%a in (%$line%) do echo %%a | find /i "Oracle" || set $newpath=!$newpath!;%%a
set $newpath=!$newpath:#= !
echo set path=!$newpath:~1!

最後の行にechoを入れました。結果を確認し、問題ない場合は削除します。

5
SachaDee

これにより、サブストリングC:\Program Files (x86)\Git\bin;がPATHストリングから削除され、再割り当てされます。

set PATH=%PATH:C:\Program Files (x86)\Git\bin;=%

これを使用して変更を確認できます。

echo %PATH:C:\Program Files (x86)\Git\bin;=% | tr ; \n

注:部分文字列を正確に指定してください。大文字と小文字が区別され、スラッシュも区別されます。

永続的な変更にする必要がある場合は、setxの代わりにsetを使用し、変更を有効にするために別のコンソールを開きます。

setx /M PATH "%PATH:C:\Program Files (x86)\Git\bin;=%"
35
Jens A. Koch

SachaDeeの答えを試した後、次のようなパスでエラーが発生しました

_C:\Program Files (x86)
_

括弧付き:Program Files (x86)\Directory

ディレクトリ _was unexpected at this time._(いつ試してみても)

追加した

_set $line=%$line:)=^^)%
_

forループの前

_set $newpath=!$newpath:^^=!
_

ループの後(必要かどうかわからない)

_@echo off
setlocal EnableDelayedExpansion
set path
set $line=%path%
set $line=%$line: =#%
set $line=%$line:;= %
set $line=%$line:)=^^)%

for %%a in (%$line%) do echo %%a | find /i "Oracle" || set $newpath=!$newpath!;%%a
set $newpath=!$newpath:#= !
set $newpath=!$newpath:^^=!
set path=!$newpath:~1!
_

そして、現在は機能しています。

6
Joe

この問題の他の解決策は少し厄介であることがわかりました。正確なパス、複雑な「遅延拡張」構文に依存したくない、「for/f」ループのスペースを削除してから追加し直したい...

私はこれがよりエレガントだと思うし、Batchの恐怖に慣れていない人でもフォローできるように、それについて地獄をコメントアウトしました。

::Turn off command display and allows environmental variables to be overridden for the current session
@echo off & setlocal

::Creates a unique file to use for the 'for loop'
set "TMPFILE="%temp%\tmp%RANDOM%%RANDOM%.txt""

::Duplicate PATH into OLDPATH
set "OLDPATH=%PATH%"

::Declare label for the 'goto' command
:Loop

::Extract the first text token with the default delimiter of semicolon
for /f "tokens=1 delims=;" %%G in ("%OLDPATH%") do (

REM Copy text token to TMPFILE unless what we want to remove is found
<NUL set /p="%%G" | find /i "StRiNgThAtMaTcHeSwHaTtOrEmOvE" >NUL 2>&1 || <NUL set /p="%%G;" >>%TMPFILE%

REM Remove text token from OLDPATH
set "OLDPATH=%OLDPATH:*;=%"
)

::Repeat loop until OLDPATH no longer has any delimiters, and then add any remaining value to TMPFILE
echo %OLDPATH% | findstr /C:";" >NUL && (goto :Loop) || <NUL set /p="%OLDPATH%" >>%TMPFILE%

::Set the path to TMPFILE
for /f "usebackq delims=" %%G in (%TMPFILE%) do (set "PATH=%%G")

::Clean-up
del %TMPFILE% >NUL 2>&1

::An echo and pause just for debug purposes
echo %PATH%
pause
0
Vopel