有効範囲: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のパス名が存在する可能性があり、すべて削除する必要があります。ここでソリューションを実装してみました...
ただし、機能していません。スクリプトはパス名を見つけられませんでした。任意の助けをいただければ幸いです。ありがとうございました。
次のようなものを試すことができます:
@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
を入れました。結果を確認し、問題ない場合は削除します。
これにより、サブストリング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;=%"
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!
_
そして、現在は機能しています。
この問題の他の解決策は少し厄介であることがわかりました。正確なパス、複雑な「遅延拡張」構文に依存したくない、「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