适用范围: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 字符串中删除子字符串
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;=%"
你可以尝试这样的事情:
@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
。检查结果,如果适合您,请将其删除。
尝试 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
我在 CYGWIN 中使用它来在启动一些 Windows 命令之前过滤掉 CYGWIN 路径:
export PATH=`perl -e '@a=grep {$_ =~ /^\/cygdrive\//} split(":", $ENV{PATH});print join(":",@a)'`
我很确定它很容易适应 Windows 原生的 perl 和 bat 文件。优点:正则表达式的灵活能力。
我想从
%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
,这是 已知问题。
我编写这段代码只是为了从路径变量中删除任何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”。
如果您知道要删除的目录中存在一个文件(例如,想要删除可能包含
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
在 Windows 上,可以在系统属性 > 高级 > 环境变量...中定义环境。要在
cmd.exe
提示符下键入 sysdm.cpl
启动系统属性。
也在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
。使用 regexp.exe
进行更改。