如何检查%PATH%中是否存在目录?

时间:2020-03-06 14:48:05  来源:igfitidea点击:

如何检查PATH环境变量中是否已存在目录?这是一个开始。不过,我设法使用以下代码完成的工作是在%PATH%中回显第一个目录。由于这是一个FOR循环,我们可能会认为它会枚举%PATH%中的所有目录,但只会得到第一个目录。

有更好的方法吗?在%PATH%变量上运行find或者findstr之类的东西?我只想检查%PATH%中的目录列表中是否存在目录,以避免添加可能已经存在的目录。

FOR /F "delims=;" %%P IN ("%PATH%") DO (
    @ECHO %%~P
)

解决方案

我有一段时间没有进行任何批处理文件编程了,但是:

echo ;%PATH%; | find /C /I ";<string>;"

如果找不到字串,则应给我们0;如果找不到字串,则应给我们1或者更多。

编辑:感谢Panos,添加了不区分大小写的标志。

如果问题是"为什么此cmd脚本片段不起作用?"那么答案是for / f遍历行。 delims将行分成多个字段,但是我们只捕获了%% P`中的第一个字段。没有办法使用for / f循环来捕获任意数量的字段。

基于rcar的答案,我们必须确保未找到目标的子字符串。

if a%X%==a%PATH% echo %X% is in PATH
echo %PATH% | find /c /i ";%X%"
if errorlevel 1 echo %X% is in PATH
echo %PATH% | find /c /i "%X%;"
if errorlevel 1 echo %X% is in PATH

我使用了for循环来实现实现,并将其扩展为遍历路径的所有元素的东西。 for循环的每次迭代都会从整个路径(保留在%q和%r中)中删除路径(%p)的第一个元素。

@echo off
SET MYPATHCOPY=%PATH%

:search
for /f "delims=; tokens=1,2*" %%p in ("%MYPATHCOPY%") do (
   @echo %%~p
   SET MYPATHCOPY=%%~q;%%~r
)

if "%MYPATHCOPY%"==";" goto done;
goto search;

:done

输出示例:

Z:\>path.bat
C:\Program Files\Microsoft DirectX SDK (November 2007)\Utilities\Bin\x86
c:\program files\imagemagick-6.3.4-q16
C:\WINDOWS\system32
C:\WINDOWS
C:\SFU\common\
c:\Program Files\Debugging Tools for Windows
C:\Program Files\Nmap

我们提到要避免将目录添加到搜索路径(如果该目录已经存在)。我们打算将目录永久存储在路径中,还是只是为了批处理文件而临时存储在目录中?

如果希望将目录永久添加(或者删除)到PATH,请查看Windows资源工具包中用于管理任务的路径管理器(pathman.exe)实用程序,网址为http://support.microsoft.com/kb/927229. 这样,我们可以添加或者删除系统路径和用户路径的组件,并且它将处理异常,例如重复的条目。

如果我们只需要临时修改批处理文件的路径,则只需在路径前面添加额外的路径,由于路径中重复输入,可能会导致性能下降。

使用fordelims,我们不能捕获任意数量的字段(正如Adam所指出的),因此必须使用循环技术。以下命令脚本将在单独的行中列出" PATH"环境变量中的每个路径:

@echo off 
setlocal 
if "%~1"=="" (
    set PATHQ=%PATH%
) else (
    set PATHQ=%~1 ) 
:WHILE
    if "%PATHQ%"=="" goto WEND
    for /F "delims=;" %%i in ("%PATHQ%") do echo %%i
    for /F "delims=; tokens=1,*" %%i in ("%PATHQ%") do set PATHQ=%%j
    goto WHILE 
:WEND

它模拟了许多编程语言中发现的经典的whilewend构造。
有了这个,我们可以使用诸如findstr之类的东西来随后过滤并寻找特定的路径。例如,如果将上面的脚本保存在名为" tidypath.cmd"的文件中,则可以通过以下方式将其通过管道传递到" findstr",在标准程序目录下查找路径(使用不区分大小写的匹配):

> tidypath | findstr /i "%ProgramFiles%"

检查路径中是否有其他方法的另一种方法是执行一些无辜的可执行文件,如果该可执行文件在那里,则不会失败,然后检查结果。
例如,下一个代码片段检查maven是否在路径中:

mvn --help > NUL 2> NUL 
if errorlevel 1 goto mvnNotInPath

因此,我尝试运行mvn --help,忽略输出(如果确实存在maven,实际上不希望看到帮助)(> NUL),并且如果未找到maven也不会显示错误消息(2> NUL)。