通过批处理从%path%变量中删除不需要的路径名

时间:2014-01-22 17:27:25

标签: windows batch-file 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路径名称,并且都需要删除。我试着在这里实施解决方案......

  

How can I extract a full path from the PATH environment variable?

然而,它只是不起作用。该脚本将找不到路径名。任何帮助,将不胜感激。谢谢。

5 个答案:

答案 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 文件。优势:正则表达式的灵活威力。