代码之家  ›  专栏  ›  技术社区  ›  Axl

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

  •  58
  • Axl  · 技术社区  · 16 年前

    有没有更好的办法?像find或findstr这样的操作在%PATH%变量上?我只想检查%PATH%中的目录列表中是否存在一个目录,以避免添加可能已经存在的内容。

    FOR /F "delims=;" %%P IN ("%PATH%") DO (
        @ECHO %%~P
    )
    
    21 回复  |  直到 7 年前
        1
  •  100
  •   Community dbr    7 年前

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

    对于这个讨论,我将使用小写的path来表示文件系统中的单个文件夹路径,而大写的path来表示path环境变量。

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

    1. \ 在路径中是可选的
      大多数路径在有尾随和无尾随的情况下都同样有效 \ . 路径在逻辑上指向同一位置。路径通常混合有带尾随和不带尾随的路径 . 这可能是搜索匹配路径时最常见的实际问题。

      • 有一个例外:相对路径 C: C:\ (表示驱动器C的根目录)

    2. 某些路径具有备用短名称
      任何不符合旧的8.3标准的路径都有一个符合该标准的替代缩写形式。这是我经常看到的另一个路径问题,特别是在商业环境中。

    3. Windows接受两者 / \ 作为路径中的文件夹分隔符。
      这并不常见,但是可以使用指定路径 \ 而且它在PATH中也能正常工作(以及在许多其他Windows环境中)


    4. C:\FOLDER\和C:\FOLDER\是等价的。这实际上在处理路径时在许多上下文中都有帮助,因为开发人员通常可以附加 \ \ 已经存在。但是如果尝试执行精确的字符串匹配,这显然会导致问题。

      • 例外:不仅是 C类: C类:\ ,但是 C类:\ C:\\

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

    6. .\ ..\ 文件夹说明符可能出现在路径中
      不太可能出现在现实生活中,但是 C:\.\parent\child\..\.\child\ 相当于 C:\parent\child


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

    8. 路径可以是完全限定的或相对的。
      完全限定路径正好指向文件系统中的一个特定位置。相对路径位置根据当前工作卷和目录的值而变化。有三种主要的相对路径:

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

      在路径中包含相对路径是完全合法的。这在Unix世界中非常常见,因为默认情况下Unix不搜索当前目录,因此Unix路径通常包含 .\

    因此,为了可靠地检查路径是否已经包含路径,我们需要一种方法将任何给定的路径转换为规范(标准)形式。这个 ~s \

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

    还有一些其他问题使这个问题复杂化:

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

    10) 路径分隔符在路径名中也是有效的
    A ; 用于在路径中分隔路径,但是

    杰布同时解决了第9和第10个问题 'Pretty print' windows %PATH% variable - how to split on ';' in CMD shell

    所以我们可以把 ~z~是的

    @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%;%newPath% . 但第9期显示了这是多么不可靠。

    ! 如果启用延迟扩展,将损坏值。

    这些问题通过杰布发明的一种惊人的安全返回技术得以解决: 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
    
        2
  •  40
  •   Jon    11 年前

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

    如果找不到字符串,则应为0;如果找到字符串,则应为1或更多。

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

        3
  •  23
  •   bert bruynooghe khaled    14 年前

    检查路径中是否有内容的另一种方法是执行一些无辜的可执行文件,如果它在那里就不会失败,并检查结果。 例如,下一个代码段检查 马文 在路径中:

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

    所以我试着跑 mvn—帮助

        4
  •  10
  •   Govind Parmar    7 年前

    在阅读了这里的答案之后,我想我可以提供一个新的观点:如果这个问题的目的是要知道 如果某个可执行文件的路径 存在于 %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"
       )
    )
    
        5
  •  6
  •   Community dbr    7 年前

    for delims ,则不能捕获任意数量的字段(如所示) Adam pointed out 所以你必须使用循环技术。下面的命令脚本将列出 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
    

    它模拟了一个经典的 温德 在许多编程语言中发现的构造。 有了这个,你可以使用 findstr 随后筛选并查找特定路径。例如,如果您将上述脚本保存在名为 tidypath.cmd findstr公司 ,在标准程序目录下查找路径(使用不区分大小写的匹配):

    > tidypath | findstr /i "%ProgramFiles%"
    
        6
  •  4
  •   mousio    13 年前

    这将查找一个精确但不区分大小写的匹配,因此请注意任何后面的反斜杠等:

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

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

    checkpath "%ProgramFiles%" 查看指定的路径是否已存在于路径中。

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

        7
  •  2
  •   indiv Olivier Poulin    16 年前

    我用 对于 循环并将其扩展为遍历路径所有元素的内容。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
    
        8
  •  2
  •   Kevin Edwards    13 年前

    也可以使用子字符串替换来测试是否存在子字符串。在这里,我删除引号以创建路径\u NQ,然后从路径\u 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
    
        9
  •  2
  •   Redsplinter    13 年前

    一模一样

    set myPath=<pathToEnsure | %1>
    echo ;%PATH%; | find /C /I ";%myPath%;" >nul
    if %ERRORLEVEL% NEQ 0 set PATH=%PATH%;%myPath%
    
        10
  •  2
  •   Andriy M    11 年前

    如果您的问题是“为什么这个cmd脚本片段不能工作?”那么答案是 for /f delims 将行拆分为字段,但您只捕获中的第一个字段 %%P . 无法使用 用于/f

        11
  •  2
  •   Community dbr    7 年前

    Heyvoon's (2015.06.08)

    $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
    

    要重新组合以更新路径:

    $x=$null;foreach ($t in ($env:Path -split ";") ) {if (test-path $t) {$x+=$t+";"}};$x
    
        12
  •  1
  •   Adam Mitz    16 年前

    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
    
        13
  •  1
  •   ketorin    16 年前

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

    如果要将目录永久添加(或删除)到路径,请查看Windows管理任务资源工具包工具中的路径管理器(pathman.exe)实用程序, http://support.microsoft.com/kb/927229 . 使用它,您可以添加或删除系统和用户路径的组件,并且它将处理诸如重复条目之类的异常情况。

    如果您只需要临时修改批处理文件的路径,我只需要在路径前面添加额外的路径,因为路径中存在重复条目,因此可能会对性能造成轻微影响。

        14
  •  1
  •   Noam Manos wim    13 年前

    将目录添加到路径(如果尚未存在):

    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%)
    
        15
  •  1
  •   Chris Degnen Akila Dilan Md    13 年前

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

    此演示旨在说明errorlevel逻辑:

    @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
    

    not errorlevel 1 “已使用。

    附言

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

    在endlocal之后,您将回到原来的路径。

        16
  •  1
  •   Morten Grøtan    13 年前

    当为路径提供空间时,它会抛出。

    调用addPath“c:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\Bin”

    “Files”未被识别为内部或外部命令,

        17
  •  1
  •   user1454091    12 年前

    通常,这是将一个exe/dll放在路径上。只要此文件不会出现在其他任何地方:

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

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

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

    例如:

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

    new_path 从我们的 PATH 新建\u路径 不存在条件成功 新建\u路径 将附加到 路径 第一次。如果 新建\u路径 已存在,则条件失败,我们将不添加 新建\u路径 第二次。

        19
  •  1
  •   Luís Cruz    9 年前

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

    这是回报 TRUE FALSE

    简短,简单!

        20
  •  1
  •   Stephan    7 年前

    作为一种选择:

    1. 在要搜索的文件夹中 PATH 变量,创建一个临时文件,其名称非常特殊,您永远不会期望计算机上的任何其他文件具有此名称。

    2. 使用标准的批处理脚本构造,通过查找由某个环境变量定义的目录列表(通常是 路径 ).

    @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. 在一个人的头脑中建立一个全局唯一的文件名不能被认为是非常可靠的。生成这样一个名称本身并不是一项简单的任务。

        21
  •  0
  •   Alessandro Minoccheri    12 年前

    此例程将在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
    )
    
        22
  •  0
  •   Günter Zöchbauer    5 年前

    -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
    }