你会如何写一个.bat或.cmd文件以删除从路径中的元素?(How would you write

2019-08-06 16:05发布

有关:
如何列出的路径在批处理文件中的元素?
如何工作?

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

  • 在不同的情况下
  • 简短名字和长名称

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

答案是这样的:

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

...其中%elementToRemove%是路径元素删除。 KeepIfUnique必须是一个子程序,它有两个参数-目录名,他们正常化,并追加的第一个参数TPATH如果它不等于第二个参数(elementToRemove)。

正如我所说的,我可以用tr.exe做到这一点,但我可以在Windows CMD.EXE的外壳只是内置命令做呢?

编辑 :我想,当你面对它时,问题是,如何做大小写转换输入cmd.exe?

Answer 1:

这是我想出了使用伊戈尔的提示。

@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%


Answer 2:

if命令有忽略大小写选项

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

请参阅if /? 对于使用它更多的帮助。 我通常会发现这些命令有助于确定如何做一些CMD线挂羊头卖狗肉:

if /?
call /?
for /?
set /?


Answer 3:

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

如果你想,他所提供的批处理文件完成后还要工作的脚本,然后改变这样这个最后一行:

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

这采用了巧妙的方法:在“TPATH”变量时,可以使用该行被读入和通过CMD.EXE解析,并通过扩大 “ENDLOCAL”越来越被删除之前。

这允许更改“PATH”变量,即使该批处理文件退出后继续存在。



文章来源: How would you write a .bat or .cmd file to remove an element from the PATH?