2009-09-15 45 views
5

相关:
How to list the elements of the path in a batch file?
How does FOR work?如何编写.bat或.cmd文件以从PATH中删除元素?

你会如何编写一个批处理文件或CMD文件从路径中删除一个元素?它应妥善处理:如果

  • 差异
  • 短名和长名

我做这个使用tr.exe但它是缓慢而复杂,使用临时文件,这使得它更更复杂。

认为的答案是这样的:

setlocal 
set tpath="" 
set _path="%PATH:;=" "%" 
for %%p in (%_path%) do (
    call :KeepIfNotEqual %%p %elementToRemove% 
) 
endlocal & set path=%tpath% 

...其中%elementToRemove%是路径元素删除。 KeepIfUnique必须是一个具有两个参数的子例程 - 目录名称,对它们进行归一化处理,并且如果不等于第二个参数(elementToRemove)的,则将第一个参数附加到tpath。

正如我所说,我可以用tr.exe来做到这一点,但我可以用windows cmd.exe shell中的内置命令来做到吗?

编辑:我想当你得到它的时候,问题是,如何在cmd.exe中进行大小写转换?

+0

Windows 7包含了PowerShell 2,它可以让你的生活变得更轻松... – TrueWill 2009-09-16 01:02:32

回答

4

这就是我想到的,使用伊戈尔的提示。

@echo off 
goto START 

------------------------------------------------------- 
rmpath.bat 

remove a path element from path 

Created Tue Sep 15 21:33:54 2009 

------------------------------------------------------- 

:START 
SETLOCAL ENABLEDELAYEDEXPANSION 

@REM require one argument (the path element to remove) 
if _%1==_ goto USAGE 

@REM ~fs = remove quotes, full path, short names 
set fqElement=%~fs1 

@REM convert path to a list of quote-delimited strings, separated by spaces 
set fpath="%PATH:;=" "%" 

@REM iterate through those path elements 
for %%p in (%fpath%) do (
    @REM ~fs = remove quotes, full path, short names 
    set p2=%%~fsp 
    @REM is this element NOT the one we want to remove? 
    if /i NOT "!p2!"=="%fqElement%" (
     if _!tpath!==_ (set tpath=%%~p) else (set tpath=!tpath!;%%~p) 
    ) 
) 

set path=!tpath! 

@call :LISTPATH 

goto ALL_DONE 
------------------------------------------------------- 

-------------------------------------------- 
:LISTPATH 
    echo. 
    set _path="%PATH:;=" "%" 
    for %%p in (%_path%) do if not "%%~p"=="" echo  %%~p 
    echo. 
    goto :EOF 
-------------------------------------------- 


-------------------------------------------- 
:USAGE 
    echo usage: rmpath ^<arg^> 
    echo  removes a path element from the path. 
    goto ALL_DONE 

-------------------------------------------- 

:ALL_DONE 
ENDLOCAL & set path=%tpath% 
+0

伟大的解决方案。这个参数是否需要引用?这是否删除路径中的所有条目,或只是第一个? – 2015-11-12 23:03:55

1

if命令有忽略大小写选项

if /I "Blah"=="blah" (echo true) else (echo false) 

if /?以获得更多帮助使用它。我通常会发现这些命令有助于确定如何做一些cmd线的诡计:

if /? 
call /? 
for /? 
set /? 
+0

虽然我明白你不想用勺子喂人的答案,但这个问题并不完全简单,并且有很多移动部分。这是一个需要解决的常见问题。 – 2015-11-12 23:07:29

0

我想补充一些Cheeso的答案......但我没有足够的代表添加评论。

如果你想剧本,他甚至提供了后批处理文件已完成工作,然后更改的最后一行是这样的:

@echo off 
    . . . 
    . . . 
SETLOCAL ENABLEDELAYEDEXPANSION 
    . . . 
    . . . 
endlocal & set path=%tpath% 

这采用了巧妙的方法:在“TPATH '该变量在cmd.exe 和扩展的被'endlocal'删除之前被读入和解析。

即使在批处理文件退出后,这也允许更改'PATH'变量。