范围: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路径名称,并且都需要删除。我试着在这里实施解决方案......
How can I extract a full path from the PATH environment variable?
然而,它只是不起作用。该脚本将找不到路径名。任何帮助,将不胜感激。谢谢。
答案 0 :(得分:34)
这将从PATH字符串中删除子字符串C:\Program Files (x86)\Git\bin;
并重新分配:
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;=%"
答案 1 :(得分:6)
在尝试了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!
它现在正在运作。
答案 2 :(得分:5)
您可以尝试这样的事情:
@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
推到了最后一行。检查结果,如果没问题,请将其删除。
答案 3 :(得分:0)
我发现此问题的其他解决方案有点尴尬,我真的不想依赖确切的路径,复杂的“延迟扩展”语法,为“ 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
答案 4 :(得分:0)
在启动一些 Windows 命令之前,我在 CYGWIN 中使用它来过滤掉 CYGWIN 路径:
export PATH=`perl -e '@a=grep {$_ =~ /^\/cygdrive\//} split(":", $ENV{PATH});print join(":",@a)'`
我很确定它很容易适应 Windows 原生的 perl 和 bat 文件。优势:正则表达式的灵活威力。