【问题标题】:How would you write a .bat or .cmd file to remove an element from the PATH?您将如何编写 .bat 或 .cmd 文件以从 PATH 中删除元素?
【发布时间】:2009-09-15 22:39:02
【问题描述】:

相关:
How to list the elements of the path in a batch file?
How does FOR work?

如何编写批处理文件或 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 中进行大小写转换?

【问题讨论】:

  • Windows 7 包含 PowerShell 2,它有望让您的生活更轻松...

标签: windows scripting batch-file cmd


【解决方案1】:

这是我想出的,使用 Igor 的提示。

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

【讨论】:

  • 很好的解决方案。这个参数需要加引号吗?这会从路径中删除所有条目,还是仅删除第一个?
【解决方案2】:

if 命令有忽略大小写选项

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

有关使用它的更多帮助,请参阅if /?。我通常发现这些命令有助于确定如何执行一些命令行技巧:

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

【讨论】:

  • 虽然我知道您不想用勺子喂别人答案,但这个问题并不完全简单,而且有很多活动部分。这是一个需要解决的常见问题。
【解决方案3】:

我想在 Cheeso 的回答中添加一些内容...但我没有足够的代表来添加评论。

如果您希望他提供的脚本即使在批处理文件完成后也能正常工作,那么像这样更改最后一行:

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

这采用了一个巧妙的技巧:当该行被 cmd.exe 读入和解析并在被删除之前展开时,'tpath' 变量可用'endlocal'。

这允许对“PATH”变量的更改即使在批处理文件退出后仍然存在。

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多