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

问题描述 投票:0回答:9

适用范围: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 .2.0 in”。不幸的是,不仅 oracle 路径名可能与上面显示的不同,还可能有多个 oracle 路径名,并且所有这些都需要删除。我尝试在这里实施解决方案...

如何从 PATH 环境变量中提取完整路径?

但是,它就是行不通。该脚本找不到路径名。任何帮助,将不胜感激。谢谢你。

windows batch-file path
9个回答
84
投票

这将从 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;=%"

11
投票

你可以尝试这样的事情:

@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
。检查结果,如果适合您,请将其删除。


9
投票

尝试 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
投票

我发现这个问题的其他解决方案有点尴尬,我真的不想依赖精确的路径,复杂的“延迟扩展”语法,删除“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
投票

我在 CYGWIN 中使用它来在启动一些 Windows 命令之前过滤掉 CYGWIN 路径:

export PATH=`perl -e '@a=grep {$_ =~ /^\/cygdrive\//} split(":", $ENV{PATH});print join(":",@a)'`

我很确定它很容易适应 Windows 原生的 perl 和 bat 文件。优点:正则表达式的灵活能力。


0
投票

我想从

%LocalAppData%\Microsoft\WindowsApps;
中删除
PATH
。但这是不可能的,因为在 Windows 环境变量中使用了另一个变量。
CALL
hack 是在 SS64 中实现的。 (另外,感谢 Jens A. Koch 的基本命令。)

CALL set PATH=%PATH:%LocalAppData%\Microsoft\WindowsApps;=%

当然,

PATH
SET
的改变不会是永久的。对于固定更改,需要使用
SETX
命令或直接更改注册表中的条目。

实际上,这个解决方案并不需要从

%LocalAppData%\Microsoft\WindowsApps;
中删除
PATH

%LocalAppData%\Microsoft\WindowsApps;
存储在注册表
PATH
键的
HKCU\Environment
条目中。虽然使用
REG DELETE
命令删除该条目更为实用,但如果 PATH 条目中还有其他目录,它们也会被删除,因此需要新的解决方案。

我未能从

%USERPROFILE%
中删除
SET
变量语法(
%%
符号困境)。幸运的是,PShell 来救援:

SET userprofile=
Powershell -c "$UserEnvironmentPath = [System.Environment]::GetEnvironmentVariable('Path', 'User'); $UserEnvironmentPath = $UserEnvironmentPath.Replace('%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;',''); [Microsoft.Win32.Registry]::SetValue('HKEY_CURRENT_USER\Environment', 'Path', $UserEnvironmentPath, [Microsoft.Win32.RegistryValueKind]::ExpandString)"

特别感谢vonpryz最后一个命令。因为 PowerShell 的

[System.Environment]::SetEnvironmentVariable
命令会将变量以
REG_SZ
的形式保存到注册表中,即使它们的原始值类型是
REG_EXPAND_SZ
,这是 已知问题


0
投票

我编写这段代码只是为了从路径变量中删除任何Python可执行路径, 并在路径中插入我自己的特定 python 版本,这样我就可以运行 python 我想要的版本。

setlocal enableDelayedExpansion 
set path`enter code here`
set $line=%path%
set $line=%$line: =#%
set $line=%$line:;= %
set $line=%$line:)=^^)%
set newpath=
for %%a in (%$line%)  do (
   echo %%a | find /i "python" ||set newpath=!newpath!;%%a
)
set path=!newpath!
set PATH=D:\python2.7\;%PATH%
@REM Rest of your script

python --version

@REM to exit the batch but not the window
exit /b

还有,第一行很重要!不要删除它,否则它将不起作用。

注意:此代码必须从批处理“.bat”文件运行,如果您想在cmd窗口中复制粘贴此代码,则必须将此代码中的所有“%%a”替换为“%a”。


0
投票

如果您知道要删除的目录中存在一个文件(例如,想要删除可能包含

java.exe
的所有路径),则以下操作将非常简单,只需进行字符串替换,无需解析路径等:

@REM Executable to look for
set CMD=java.exe

:search
@REM Find the executable anywhere in the path
for %%a in (%CMD%) do set FOUND=%%~$PATH:a
if "%FOUND%"=="" goto done

@REM Strip \cmd.ext so we just have the directory
set FOUND=!FOUND:\%CMD%=!
@echo Found %CMD% in %FOUND%

@echo Removing %FOUND% from path...
set "PATH=!PATH:%FOUND%=!"

@REM Clean up any lone leftover \ in the path (in case the path was C:\foo\ instead of C:\foo)
set PATH=%PATH:;\;=;%

goto search
:done

0
投票

在 Windows 上,可以在系统属性 > 高级 > 环境变量...中定义环境。要在

cmd.exe
提示符下键入
sysdm.cpl
启动系统属性。 也在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
。使用
regexp.exe
进行更改。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.