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

如何检查目录是否已经出现在 PATH 环境变量中?这是个开始。但是,我对下面的代码所做的全部工作就是回显% PATH% 中的第一个目录。由于这是一个 FOR 循环,您可能会认为它会枚举% PATH% 中的所有目录,但是它只获取第一个目录。

还有更好的办法吗?在% PATH% 变量上运行的类似 找到FINDSTR的操作?我只想检查% PATH% 中的目录列表中是否存在一个目录,以避免添加可能已经存在的内容。

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

这可能行得通:

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

如果没有找到字符串,则返回0; 如果找到了,则返回1或更多。

如果你的问题是“为什么这个 cmd 脚本片段不工作?”那么答案就是 for /f遍历行。delims将行拆分为字段,但是您只捕获了 %%P中的第一个字段。使用 for /f循环无法捕获任意数量的字段。

基于 Randy 的回答,必须确保没有找到目标的子字符串。

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 循环的每次迭代都将路径的第一个元素(% p)从整个路径中移除(保存在% q 和% r 中)。

@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 Resource Kit Tools 中用于管理任务的 PATH Manager (pathman.exe)实用工具 http://support.microsoft.com/kb/927229。有了它,您可以添加或删除系统和用户路径的组件,它将处理重复条目等异常情况。

如果您只需要为批处理文件临时修改路径,那么我只需要在路径前面添加额外的路径,因为路径中的重复条目可能会导致性能受到轻微影响。

使用 fordelims,您不能捕获任意数量的字段(也是 亚当指出) ,因此必须使用循环技术。下面的命令脚本将在单独的一行中列出 ABc2环境变量中的每个路径:

@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

它模拟在许多编程语言中发现的经典 同时... Wend结构。 有了这个,您就可以使用类似 findstr的东西来随后过滤和寻找特定的路径。例如,如果您将上面的脚本保存在一个名为 tidypath.cmd的文件中,那么下面是如何通过管道连接到 findstr,在标准程序目录下查找路径(使用不区分大小写的匹配) :

> tidypath | findstr /i "%ProgramFiles%"

检查路径中是否有内容的另一种方法是执行一些无害的可执行文件,如果有的话,这些可执行文件不会失败,然后检查结果。

例如,下面的代码片段检查 玛文是否在路径中:

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

所以我尝试运行 救命,忽略输出(如果 Maven 存在,我实际上不想看到帮助)(> NUL) ,如果没有找到 Maven,也不显示错误消息(2 > 空白)。

如果目录尚不存在,则将其添加到 PATH:

set myPath=c:\mypath
For /F "Delims=" %%I In ('echo %PATH% ^| find /C /I "%myPath%"') Do set pathExists=%%I 2>Nul
If %pathExists%==0 (set PATH=%myPath%;%PATH%)

这将寻找一个精确的,但大小写不敏感的匹配,所以注意任何后面的反斜杠等:

for %P in ("%path:;=";"%") do @if /i %P=="PATH_TO_CHECK" echo %P exists in PATH

或者,在一个带有参数的批处理文件(例如 checkpath.bat)中:

@for %%P in ("%path:;=";"%") do @if /i %%P=="%~1" echo %%P exists in PATH

在后一种形式中,可以调用例如 checkpath "%ProgramFiles%"来查看 PATH 中是否已经存在指定的路径。

请注意,此实现假定单个路径项中不存在分号或引号。

只是作为一种选择:

  1. 在要搜索 PATH变量的文件夹中,创建一个临时文件,该文件的名称不同寻常,您永远不会想到计算机上会有其他任何文件。

  2. 使用标准的批处理脚本结构,通过查找由某些环境变量(通常是 PATH)定义的目录列表来执行文件搜索。

  3. 检查搜索结果是否与问题路径匹配,并显示结果。

  4. 删除临时文件。

这可能看起来像这样:

@ECHO OFF
SET "mypath=D:\the\searched-for\path"
SET unusualname=nowthisissupposedtobesomeveryunusualfilename
ECHO.>"%mypath%\%unusualname%"
FOR %%f IN (%unusualname%) DO SET "foundpath=%%~dp$PATH:f"
ERASE "%mypath%\%unusualname%"
IF "%mypath%" == "%foundpath%" (
ECHO The dir exists in PATH
) ELSE (
ECHO The dir DOES NOT exist in PATH
)

已知问题:

  1. 该方法只有在目录存在的情况下才能工作(情况并非总是如此)。

  2. 在目录中创建/删除文件会影响其“修改日期/时间”属性(这有时可能是一种不希望出现的效果)。

  3. 在头脑中创建一个全球唯一的文件名不能被认为是非常可靠的。生成这样一个名称本身并非易事。

还可以使用子字符串替换来测试子字符串是否存在。在这里,我删除引号来创建 PATH _ NQ,然后从 PATH _ NQ 中删除“ c: mydir”,并将其与原始数据进行比较,以查看是否有任何更改:

set PATH_NQ=%PATH:"=%
if not "%PATH_NQ%"=="%PATH_NQ:c:\mydir=%" goto already_in_path
set PATH=%PATH%;c:\mydir
:already_in_path

这个版本相当不错。它只是检查可执行 Vim71(维姆7.1)是否在路径中,如果没有,则预置它。

@echo off
echo %PATH% | find /c /i "vim71" > nul
if not errorlevel 1 goto jump
PATH = C:\Program Files\Vim\vim71\;%PATH%
:jump

这个演示是为了说明 错误级别的逻辑:

@echo on
echo %PATH% | find /c /i "Windows"
if "%errorlevel%"=="0" echo Found Windows
echo %PATH% | find /c /i "Nonesuch"
if "%errorlevel%"=="0" echo Found Nonesuch

由于 错误级别1等价于 错误级别 > = 1,因此 Vim71代码中的逻辑是相反的。因此,错误级别0总是计算 true,所以使用“ not errorlevel 1”。

Postscript : 如果您使用 本地人本地的来定位您的环境设置,则可能不需要进行检查,例如,

@echo off
setlocal
PATH = C:\Program Files\Vim\vim71\;%PATH%
rem your code here
endlocal

在 ENDLOCAL 之后,你回到了原来的路径。

我将上面的一些答案结合起来得出了这个结论,以确保给定的路径条目存在 一模一样,尽可能简洁,并且命令行上没有垃圾回声。

set myPath=<pathToEnsure | %1>
echo ;%PATH%; | find /C /I ";%myPath%;" >nul
if %ERRORLEVEL% NEQ 0 set PATH=%PATH%;%myPath%

首先,我将指出一些使这个问题难以完美解决的问题。然后我会提出我能想到的最防弹的解决方案。

在本文中,我将使用小写路径表示文件系统中的单个文件夹路径,使用大写 PATH 表示 PATH 环境变量。

从实际的角度来看,大多数人想知道 PATH 是否包含给定路径的逻辑等价物,而不是 PATH 是否包含给定路径的精确字符串匹配。这可能会带来问题,因为:

  1. 在路径中,尾随 \是可选的
    大多数路径在有和没有后跟 \的情况下都能很好地工作。路径在逻辑上指向同一个位置。PATH 经常混合使用带有和不带有尾随 \的路径。这可能是在 PATH 中搜索匹配项时最常见的实际问题。

    • 有一个例外: 相对路径 C:(意味着驱动器 C 的当前工作目录)与 C:\(意味着驱动器 C 的根目录)非常不同

  2. 有些路径有备用的短名称
    任何不符合旧的8.3标准的路径都有一个符合标准的备选短格式。这是我经常看到的另一个 PATH 问题,特别是在业务设置中。

  3. Windows 接受 /\作为路径中的文件夹分隔符。
    这种情况并不常见,但是可以使用 /而不是 \来指定路径,它在 PATH (以及许多其他 Windows 上下文)

  4. 中运行良好
  5. Windows 将连续的文件夹分隔符视为一个逻辑分隔符。
    C: 文件夹和 C: 文件夹是等价的。在处理路径时,这实际上在许多上下文中都有帮助,因为开发人员通常可以将 \附加到路径中,而无需检查尾随的 \是否已经存在。但是如果试图执行精确的字符串匹配,这显然会导致问题。

    • 异常: 不仅 C:不同于 C:\,而且 C:\(有效路径)也不同于 C:\\(无效路径)。

  6. Windows 从文件和目录名称中删除尾随的点和空格。
    "C:\test. "等于 "C:\test"

  7. 当前 .\和父 ..\文件夹说明符可能出现在路径中
    在现实生活中不太可能看到,但像 C:\.\parent\child\..\.\child\这样的东西相当于 C:\parent\child

  8. 路径可以选择用双引号括起来。
    路径通常用引号括起来,以防 <space> , ; ^ & =之类的特殊字符。实际上,任何数量的引号都可以出现在路径之前、之内和/或之后。它们被 Windows 忽略,除非是为了防止特殊字符。除非路径包含 ;,否则 PATH 中永远不需要引号,但是引号可能永远不会出现。

  9. 路径可以是完全限定的或相对的。
    完全限定路径指向文件系统中的一个特定位置。相对路径位置的变化取决于当前工作卷和目录的值。相对路径有三种基本风格:

    • D: 是相对于卷 d 的当前工作目录的:
    • \myPath 是相对于当前工作量(可以是 C: ,D: 等)
    • myPath 是相对于当前工作卷和目录的

    在 PATH 中包含相对路径是完全合法的。这在 Unix 世界中很常见,因为 Unix 默认情况下不搜索工作目录,所以 Unix PATH 通常包含 .\。但是 Windows 默认搜索工作目录,所以相对路径在 Windows PATH 中很少见。

因此,为了可靠地检查 PATH 是否已经包含路径,我们需要一种方法来将任何给定的路径转换为规范(标准)形式。FOR 变量和参数扩展使用的 ~s修饰符是一种简单的方法,它解决问题1-6,并部分解决问题7。~s修饰符删除附加引号,但保留内部引号。问题7可以通过在比较之前从所有路径中显式删除引号来完全解决。注意,如果路径实际上不存在,那么 ~s修饰符将不会将 \附加到路径,也不会将路径转换为有效的8.3格式。

~s的问题在于它将相对路径转换为完全限定路径。这对于问题8是有问题的,因为相对路径永远不应该与完全限定路径匹配。我们可以使用 FINDSTR 正则表达式将路径分类为完全限定路径或相对路径。正常的完全限定路径必须以 <letter>:<separator>开始,而不是以 <letter>:<separator><separator>开始,其中 < 分隔符 > 是 \/。UNC 路径总是完全限定的,必须从 \\开始。当比较完全限定路径时,我们使用 ~s修饰符。在比较相对路径时,我们使用原始字符串。最后,我们从不将完全限定路径与相对路径进行比较。该策略为问题8提供了一个很好的实用解决方案。唯一的限制是可以将两个逻辑上等效的相对路径视为不匹配,但这是一个次要问题,因为相对路径在 Windows PATH 中很少见。

还有一些额外的问题使这个问题复杂化:

9) 在处理包含特殊字符的 PATH 时,正常展开是不可靠的。
PATH 中不需要引用特殊字符,但可以引用 C:\THIS & THAT;"C:\& THE OTHER THING"是完全有效的,但是不能使用简单的展开安全地展开,因为 "%PATH%"%PATH%都会失败。

10) 路径分隔符在路径名中也是有效的
;用于在 PATH 中分隔路径,但是 ;也可以是路径中的有效字符,在这种情况下必须引用路径。这会导致解析问题。

Jeb 在 漂亮的打印窗口% PATH% 变量-如何在 CMD shell 上分割解决了第9和第10个问题

因此,我们可以结合 ~s修饰符和路径分类技术,以及我对 jeb 的 PATH 解析器的改进,得到这个几乎万无一失的解决方案,以检查 PATH 中是否已经存在给定的路径。该函数可以在批处理文件中包含和调用,也可以单独存在并作为自己的 inPath.bat 批处理文件调用。它看起来像很多代码,但其中超过一半是注释。

@echo off
:inPath pathVar
::
::  Tests if the path stored within variable pathVar exists within PATH.
::
::  The result is returned as the ERRORLEVEL:
::    0 if the pathVar path is found in PATH.
::    1 if the pathVar path is not found in PATH.
::    2 if pathVar is missing or undefined or if PATH is undefined.
::
::  If the pathVar path is fully qualified, then it is logically compared
::  to each fully qualified path within PATH. The path strings don't have
::  to match exactly, they just need to be logically equivalent.
::
::  If the pathVar path is relative, then it is strictly compared to each
::  relative path within PATH. Case differences and double quotes are
::  ignored, but otherwise the path strings must match exactly.
::
::------------------------------------------------------------------------
::
:: Error checking
if "%~1"=="" exit /b 2
if not defined %~1 exit /b 2
if not defined path exit /b 2
::
:: Prepare to safely parse PATH into individual paths
setlocal DisableDelayedExpansion
set "var=%path:"=""%"
set "var=%var:^=^^%"
set "var=%var:&=^&%"
set "var=%var:|=^|%"
set "var=%var:<=^<%"
set "var=%var:>=^>%"
set "var=%var:;=^;^;%"
set var=%var:""="%
set "var=%var:"=""Q%"
set "var=%var:;;="S"S%"
set "var=%var:^;^;=;%"
set "var=%var:""="%"
setlocal EnableDelayedExpansion
set "var=!var:"Q=!"
set "var=!var:"S"S=";"!"
::
:: Remove quotes from pathVar and abort if it becomes empty
set "new=!%~1:"=!"
if not defined new exit /b 2
::
:: Determine if pathVar is fully qualified
echo("!new!"|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
/c:^"^^\"[\\][\\]" >nul ^
&& set "abs=1" || set "abs=0"
::
:: For each path in PATH, check if path is fully qualified and then do
:: proper comparison with pathVar.
:: Exit with ERRORLEVEL 0 if a match is found.
:: Delayed expansion must be disabled when expanding FOR variables
:: just in case the value contains !
for %%A in ("!new!\") do for %%B in ("!var!") do (
if "!!"=="" endlocal
for %%C in ("%%~B\") do (
echo(%%B|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
/c:^"^^\"[\\][\\]" >nul ^
&& (if %abs%==1 if /i "%%~sA"=="%%~sC" exit /b 0) ^
|| (if %abs%==0 if /i "%%~A"=="%%~C" exit /b 0)
)
)
:: No match was found so exit with ERRORLEVEL 1
exit /b 1

函数可以这样使用(假设批处理文件名为 inPath.bat) :

set test=c:\mypath
call inPath test && (echo found) || (echo not found)



通常,检查 PATH 中是否存在路径的原因是,如果路径不存在,则要追加该路径。这通常是通过使用类似 path %path%;%newPath%的东西来完成的。但是第9期展示了这是如何的不可靠。

另一个问题是如何返回函数末尾的 ENDLOCAL 屏障上的最终 PATH 值,特别是如果可以在启用或禁用延迟扩展的情况下调用该函数。如果启用延迟扩展,任何未转义的 !都将损坏该值。

这些问题是解决使用一个惊人的安全返回技术 Jeb 发明了这里: http://www.dostips.com/forum/viewtopic.php?p=6930#p6930

@echo off
:addPath pathVar /B
::
::  Safely appends the path contained within variable pathVar to the end
::  of PATH if and only if the path does not already exist within PATH.
::
::  If the case insensitive /B option is specified, then the path is
::  inserted into the front (Beginning) of PATH instead.
::
::  If the pathVar path is fully qualified, then it is logically compared
::  to each fully qualified path within PATH. The path strings are
::  considered a match if they are logically equivalent.
::
::  If the pathVar path is relative, then it is strictly compared to each
::  relative path within PATH. Case differences and double quotes are
::  ignored, but otherwise the path strings must match exactly.
::
::  Before appending the pathVar path, all double quotes are stripped, and
::  then the path is enclosed in double quotes if and only if the path
::  contains at least one semicolon.
::
::  addPath aborts with ERRORLEVEL 2 if pathVar is missing or undefined
::  or if PATH is undefined.
::
::------------------------------------------------------------------------
::
:: Error checking
if "%~1"=="" exit /b 2
if not defined %~1 exit /b 2
if not defined path exit /b 2
::
:: Determine if function was called while delayed expansion was enabled
setlocal
set "NotDelayed=!"
::
:: Prepare to safely parse PATH into individual paths
setlocal DisableDelayedExpansion
set "var=%path:"=""%"
set "var=%var:^=^^%"
set "var=%var:&=^&%"
set "var=%var:|=^|%"
set "var=%var:<=^<%"
set "var=%var:>=^>%"
set "var=%var:;=^;^;%"
set var=%var:""="%
set "var=%var:"=""Q%"
set "var=%var:;;="S"S%"
set "var=%var:^;^;=;%"
set "var=%var:""="%"
setlocal EnableDelayedExpansion
set "var=!var:"Q=!"
set "var=!var:"S"S=";"!"
::
:: Remove quotes from pathVar and abort if it becomes empty
set "new=!%~1:"^=!"
if not defined new exit /b 2
::
:: Determine if pathVar is fully qualified
echo("!new!"|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
/c:^"^^\"[\\][\\]" >nul ^
&& set "abs=1" || set "abs=0"
::
:: For each path in PATH, check if path is fully qualified and then
:: do proper comparison with pathVar. Exit if a match is found.
:: Delayed expansion must be disabled when expanding FOR variables
:: just in case the value contains !
for %%A in ("!new!\") do for %%B in ("!var!") do (
if "!!"=="" setlocal disableDelayedExpansion
for %%C in ("%%~B\") do (
echo(%%B|findstr /i /r /c:^"^^\"[a-zA-Z]:[\\/][^\\/]" ^
/c:^"^^\"[\\][\\]" >nul ^
&& (if %abs%==1 if /i "%%~sA"=="%%~sC" exit /b 0) ^
|| (if %abs%==0 if /i %%A==%%C exit /b 0)
)
)
::
:: Build the modified PATH, enclosing the added path in quotes
:: only if it contains ;
setlocal enableDelayedExpansion
if "!new:;=!" neq "!new!" set new="!new!"
if /i "%~2"=="/B" (set "rtn=!new!;!path!") else set "rtn=!path!;!new!"
::
:: rtn now contains the modified PATH. We need to safely pass the
:: value accross the ENDLOCAL barrier
::
:: Make rtn safe for assignment using normal expansion by replacing
:: % and " with not yet defined FOR variables
set "rtn=!rtn:%%=%%A!"
set "rtn=!rtn:"=%%B!"
::
:: Escape ^ and ! if function was called while delayed expansion was enabled.
:: The trailing ! in the second assignment is critical and must not be removed.
if not defined NotDelayed set "rtn=!rtn:^=^^^^!"
if not defined NotDelayed set "rtn=%rtn:!=^^^!%" !
::
:: Pass the rtn value accross the ENDLOCAL barrier using FOR variables to
:: restore the % and " characters. Again the trailing ! is critical.
for /f "usebackq tokens=1,2" %%A in ('%%^ ^"') do (
endlocal & endlocal & endlocal & endlocal & endlocal
set "path=%rtn%" !
)
exit /b 0

通常,这是为了在路径上添加 EXE 或 DLL 文件。只要这个文件不会出现在任何其他地方:

@echo off
where /q <put filename here>
if %errorlevel% == 1 (
setx PATH "%PATH%;<additional path stuff>"
) else (
echo "already set path"
)

这个例程将在 path 变量中搜索 path 或 file.ext。 如果找到,返回0。如果引用,路径或文件可能包含空格。 如果一个变量作为最后一个参数传递,它将被设置为 d:\path\file

@echo off&goto :PathCheck
:PathCheck.CMD
echo.PathCheck.CMD: Checks for existence of a path or file in %%PATH%% variable
echo.Usage: PathCheck.CMD [Checkpath] or [Checkfile] [PathVar]
echo.Checkpath must have a trailing \ but checkfile must not
echo.If Checkpath contains spaces use quotes ie. "C:\Check path\"
echo.Checkfile must not include a path, just the filename.ext
echo.If Checkfile contains spaces use quotes ie. "Check File.ext"
echo.Returns 0 if found, 1 if not or -1 if checkpath does not exist at all
echo.If PathVar is not in command line it will be echoed with surrounding quotes
echo.If PathVar is passed it will be set to d:\path\checkfile with no trailing \
echo.Then %%PathVar%% will be set to the fully qualified path to Checkfile
echo.Note: %%PathVar%% variable set will not be surrounded with quotes
echo.To view the path listing line by line use: PathCheck.CMD /L
exit/b 1


:PathCheck
if "%~1"=="" goto :PathCheck.CMD
setlocal EnableDelayedExpansion
set "PathVar=%~2"
set "pth="
set "pcheck=%~1"
if "%pcheck:~-1%" equ "\" (
if not exist %pcheck% endlocal&exit/b -1
set/a pth=1
)
for %%G in ("%path:;=" "%") do (
set "Pathfd=%%~G\"
set "Pathfd=!Pathfd:\\=\!"
if /i "%pcheck%" equ "/L" echo.!Pathfd!
if defined pth (
if /i "%pcheck%" equ "!Pathfd!" endlocal&exit/b 0
) else (
if exist "!Pathfd!%pcheck%" goto :CheckfileFound
)
)
endlocal&exit/b 1


:CheckfileFound
endlocal&(
if not "%PathVar%"=="" (
call set "%~2=%Pathfd%%pcheck%"
) else (echo."%Pathfd%%pcheck%")
exit/b 0
)

在阅读了这里的答案后,我想我可以提供一个新的观点: 如果这个问题的目的是知道 如果某个可执行文件的路径存在于 %PATH%中,如果不是,插入它(我认为 这是唯一的原因是为了做到这一点) ,那么它可以用一种稍微不同的方式来解决: “如何检查某个可执行程序的目录是否存在于% PATH%”?这个问题可以用这种方法很容易地解决:

for %%p in (programname.exe) do set "progpath=%%~$PATH:p"
if not defined progpath (
rem The path to programname.exe don't exist in PATH variable, insert it:
set "PATH=%PATH%;C:\path\to\progranname"
)

如果您不知道可执行文件的扩展名,只需查看它们:

set "progpath="
for %%e in (%PATHEXT%) do (
if not defined progpath (
for %%p in (programname.%%e) do set "progpath=%%~$PATH:p"
)
)

这是使用字符串替换的 凯文 · 爱德华兹的回答的一个变体。

基本模式是:

IF "%PATH:new_path=%" == "%PATH%" PATH=%PATH%;new_path

例如:

IF "%PATH:C:\Scripts=%" == "%PATH%" PATH=%PATH%;C:\Scripts

简而言之,我们做一个条件测试,尝试从我们的 PATH环境变量中移除/替换 new_path。如果 new_path不存在,则条件成功,并且 new_path将首次附加到 PATH。如果 new_path已经存在,那么条件失败,我们不会再次添加 new_path

您可以使用 PowerShell 来实现这一点;

Test-Path $ENV:SystemRoot\YourDirectory
Test-Path C:\Windows\YourDirectory

这将返回 TRUEFALSE

简短,简单,容易!

为了详细说明使用 PowerShell 的 Heyvoon 的回答(2015-06-08) ,这个简单的 PowerShell 脚本应该提供% path% 的详细信息:

$env:Path -split ";" | % {"$(test-path $_); $_"}

它正在产生这种可以独立验证的输出:

True;C:\WINDOWS
True;C:\WINDOWS\system32
True;C:\WINDOWS\System32\Wbem
False;C:windows\System32\windowsPowerShell\v1.0\
False;C:\Program Files (x86)\Java\jre7\bin

重新组合以更新 Path:

$x = $null; foreach ($t in ($env:Path -split ";") ) {if (test-path $t) {$x += $t + ";"}}; $x

-contains为我工作

$pathToCheck = "c:\some path\to\a\file.txt"


$env:Path - split ';' -contains $pathToCheck

在路径不存在时添加它,我使用

$pathToCheck = "c:\some path\to\a\file.txt"


if(!($env:Path -split ';' -contains $vboxPath)) {
$documentsDir = [Environment]::GetFolderPath("MyDocuments")
$profileFilePath = Join-Path $documentsDir "WindowsPowerShell/profile.ps1"
Out-File -FilePath $profileFilePath -Append -Force -Encoding ascii -InputObject "`$env:Path += `";$pathToCheck`""
Invoke-Expression -command $profileFilePath
}
rem https://stackoverflow.com/a/59571160/2292993
rem Don't get mess with %PATH%, it is a concatenation of USER+SYSTEM, and will cause a lot of duplication in the result.
for /f "usebackq tokens=2,*" %%A in (`reg query HKCU\Environment /v PATH`) do set userPATH=%%B
rem userPATH should be %USERPROFILE%\AppData\Local\Microsoft\WindowsApps


rem https://stackoverflow.com/questions/141344
for /f "delims=" %%A in ('echo ";%userPATH%;" ^| find /C /I ";%WINAPPS%;"') do set pathExists=%%A
If %pathExists%==0 (
echo Inserting user path...
setx PATH "%WINAPPS%; %userPATH%"
)