Как проверить, существует ли каталог в% PATH%?

Как проверить, присутствует ли каталог в переменной окружения PATH? Вот старт. Тем не менее, все, что мне удалось сделать с приведенным ниже кодом, является эхо-первым каталогом в% PATH%. Поскольку это цикл FOR, вы можете подумать, что он будет перечислять все каталоги в% PATH%, но он получает только первый.

Есть ли лучший способ сделать это? Что-то вроде find или findstr работает с переменной% PATH%? Я просто хотел бы проверить, существует ли каталог в списке каталогов в% PATH%, чтобы не добавлять то, что уже может быть там.

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

Ответ 1

Сначала я укажу на ряд проблем, которые затрудняют решение этой проблемы. Тогда я представим самое пуленепробиваемое решение, с которым я смог придумать.

Для этого обсуждения я буду использовать строчный путь для представления одного пути к папке в файловой системе, а верхний регистр PATH для представления переменной среды PATH.

С практической точки зрения, большинство людей хотят знать, содержит ли PATH логический эквивалент данного пути, а не содержит ли PATH точное соответствие строк для заданного пути. Это может быть проблематично, потому что:

  • Конечный \ является необязательным в пути
    Большинство путей работают одинаково хорошо как с завершающим \, так и без него. Путь логически указывает на одно и то же место в любом случае. PATH часто имеет смесь путей как с, так и без хвоста \. Это, вероятно, самая распространенная практическая проблема при поиске PATH для соответствия.

    • Есть одно исключение: относительный путь C: (то есть текущий рабочий каталог на диске C) очень отличается от C:\ (что означает корневой каталог диска C)

  • Некоторые пути имеют альтернативные короткие имена
    Любой путь, который не соответствует старому стандарту 8.3, имеет альтернативную короткую форму, соответствующую стандарту. Это еще одна проблема PATH, которую я видел с некоторой частотой, особенно в бизнес-настройках.

  • Windows принимает как /, так и \ как разделители папок в пути.
    Это наблюдается не очень часто, но путь можно указать с помощью / вместо \, и он будет функционировать просто в PATH (как и во многих других контекстах Windows)

  • Windows обрабатывает последовательные разделители папок как один логический разделитель.
    C:\FOLDER\\и C:\FOLDER\эквивалентны. Это фактически помогает во многих контекстах при работе с путём, потому что разработчик может обычно добавлять \ к пути, не беспокоясь о том, что конечный \ уже существует. Но это может вызвать проблемы при попытке выполнить точное совпадение строк.

    • Исключения: не только C:, отличное от C:\, но C:\ (допустимый путь), отличается от C:\\ (недопустимый путь).

  • Windows обрезает конечные точки и пробелы из имен файлов и каталогов.
    "C:\test. " эквивалентно "C:\test".

  • Текущие тег .\ и родительский ..\ могут отображаться в пути
    Вряд ли можно увидеть в реальной жизни, но что-то вроде C:\.\parent\child\..\.\child\ эквивалентно C:\parent\child

  • Путь может быть заключен в двойные кавычки.
    Путь часто заключен в кавычки для защиты от специальных символов, таких как <space> , ; ^ & =. Фактически любое количество кавычек может появляться до, внутри и/или после пути. Они игнорируются Windows, кроме как для защиты от специальных символов. Кавычки никогда не требуются в PATH, если в пути нет ;, но кавычки могут присутствовать никогда.

  • Путь может быть полностью квалифицированным или относительным.
    Полностью квалифицированный путь указывает только на одно конкретное место в файловой системе. Относительное местоположение пути изменяется в зависимости от значения текущих рабочих томов и каталогов. Есть три основных аромата относительных путей:

    • D: относится к текущему рабочему каталогу тома D:
    • \myPath относится к текущему рабочему объему (может быть C:, D: и т.д.)
    • myPath относится к текущему рабочему объему и директории

    Совершенно законно включать относительный путь в PATH. Это очень распространено в мире Unix, потому что Unix не выполняет поиск по текущему каталогу по умолчанию, поэтому Unix PATH часто будет содержать .\. Но Windows выполняет поиск по текущему каталогу по умолчанию, поэтому относительные пути встречаются редко в Windows PATH.

Поэтому, чтобы надежно проверить, содержит ли PATH уже путь, нам нужен способ преобразования любого заданного пути в каноническую (стандартную) форму. Модификатор ~s, используемый расширением FOR и расширением аргумента, является простым методом, который решает проблемы 1-6 и частично решает проблему 7. Модификатор ~s удаляет закрывающие кавычки, но сохраняет внутренние кавычки. Проблема 7 может быть полностью решена путем явного удаления кавычек со всех путей до сравнения. Обратите внимание: если путь физически не существует, модификатор ~s не добавит \ к пути, и он не преобразует путь в допустимый формат 8.3.

Проблема с ~s заключается в том, что она преобразует относительные пути в полные пути. Это проблема для проблемы 8, потому что относительный путь никогда не должен соответствовать полностью квалифицированному пути. Мы можем использовать регулярные выражения FINDSTR для классификации пути как полностью квалифицированного или относительного. Обычный полный путь должен начинаться с <letter>:<separator>, но не <letter>:<separator><separator>, где < разделитель > равен \ или /. Пути UNC всегда имеют полную квалификацию и должны начинаться с \\. При сравнении полностью определенных путей мы используем модификатор ~s. При сравнении относительных путей мы используем необработанные строки. Наконец, мы никогда не сравниваем полностью квалифицированный путь с относительным путем. Эта стратегия обеспечивает хорошее практическое решение для проблемы 8. Единственным ограничением является два логически эквивалентных относительных пути, которые можно рассматривать как не соответствующие, но это незначительная проблема, поскольку относительные пути встречаются редко в Windows PATH.

Есть несколько дополнительных проблем, которые усложняют эту проблему:

9) Нормальное расширение не является надежным при работе с PATH, содержащим специальные символы.
 Специальные символы не нужно указывать в PATH, но они могут быть. Таким образом, PATH нравится C:\THIS & THAT;"C:\& THE OTHER THING" совершенно правдоподобно, но его нельзя безопасно расширять, используя простое расширение, потому что сбой "%PATH%" и %PATH%.

10) Ограничение пути также допустимо в пределах имени пути
A ; используется для разграничения путей в PATH, но ; также может быть допустимым символом в пути, и в этом случае путь должен быть указан. Это вызывает проблему синтаксического анализа.

jeb решила обе проблемы 9 и 10 в 'Довольно печатать' окна% PATH% variable - как разбить на ';' в оболочке CMD

Итак, мы можем комбинировать методы модификатора и методов классификации ~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 демонстрирует, как это ненадежно.

Другая проблема заключается в том, как вернуть окончательное значение PATH по ENDLOCAL-барьеру в конце функции, особенно если функция может быть вызвана с задержкой расширения, включен или отключен. Любой unescaped ! приведет к повреждению значения, если включено замедленное расширение.

Эти проблемы решаются с помощью удивительной безопасной технологии возврата, которую изобрел здесь 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

Ответ 2

Я не программировал какое-то время в пакете, но:

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

должен дать вам 0, если строка не найдена и 1 или больше, если она есть.

EDIT: добавлен флаг, нечувствительный к регистру, благодаря Panos.

Ответ 3

Еще один способ проверить, находится ли что-то в пути, выполнить какой-то невинный исполняемый файл, который не будет терпеть неудачу, если он есть, и проверить результат. В качестве примера следующий фрагмент кода проверяет, находится ли maven в пути:

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

Итак, я пытаюсь запустить mvn -help, игнорировать вывод (на самом деле не хочу видеть помощь, если maven существует) ( > NUL), а также не отображать сообщение об ошибке, если maven не был найден (2 > NUL).

Ответ 4

После прочтения ответов здесь я думаю, что могу представить новую точку зрения: если цель этого вопроса состоит в том, чтобы узнать, существует ли путь к определенному исполняемому файлу в %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

Используя for и delims, вы не можете захватить произвольное количество полей (как Адам указал на), поэтому вместо этого вы должны использовать метод циклирования. Следующая команда script будет перечислять каждый путь в переменной среды 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

Он моделирует классическую, хотя... конструкцию wend, найденную во многих языках программирования. Используя это, вы можете использовать что-то вроде findstr, чтобы впоследствии фильтровать и искать определенный путь. Например, если вы сохранили приведенный выше script в файле с именем tidypath.cmd, то вот как вы могли бы перейти на findstr, ища пути в каталоге стандартных программ (используя совпадение без учета регистра):

> tidypath | findstr /i "%ProgramFiles%"

Ответ 6

Это будет поиск точного, но нечувствительного к регистру совпадения, поэтому учитывайте любые обратные обратные черты и т.д.:

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.

Обратите внимание, что эта реализация предполагает, что точки с запятой или кавычки не присутствуют внутри одного элемента пути.

Ответ 7

Если ваш вопрос был "почему этот фрагмент cmd script не работает?" то ответ заключается в том, что for /f выполняет итерацию по строкам. Разделите строки delims на поля, но вы только фиксируете первое поле в %%P. Невозможно записать произвольное количество полей с циклом for /f.

Ответ 8

Я взял вашу реализацию, используя цикл for, и расширил ее на то, что итерации через все элементы пути. Каждая итерация цикла 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

Ответ 9

Добавить каталог в 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%)

Ответ 10

Вы также можете использовать замену подстроки для проверки наличия подстроки. Здесь я удаляю кавычки для создания PATH_NQ, затем удаляю "c:\mydir" из PATH_NQ и сравниваю его с оригиналом, чтобы увидеть, что-то изменилось:

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

Ответ 11

Я объединил некоторые из приведенных выше ответов, чтобы придумать это, чтобы гарантировать, что указанная запись пути существует точно так же, как указано с максимально возможной кратностью, и в командной строке не будет нежелательных эхо.

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

Ответ 12

На основе ответа 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

Ответ 13

Вы упомянули, что хотите избежать добавления каталога в путь поиска, если он уже существует. Ваше намерение постоянно хранить каталог на пути или просто временно для пакетного файла?

Если вы хотите постоянно добавлять (или удалять) каталоги в PATH, обратитесь к утилите Path Manager (pathman.exe) в Windows Resource Kit Tools для административных задач, http://support.microsoft.com/kb/927229. Благодаря этому вы можете добавлять или удалять компоненты как системных, так и пользовательских путей, а также обрабатывать аномалии, такие как дубликаты записей.

Если вам нужно временно изменить путь к пакетному файлу, я просто добавлю дополнительный путь перед этим путем, так как это может привести к небольшой производительности из-за дублирования записи в пути.

Ответ 14

Как альтернатива:

  • В папке, где вы собираетесь искать переменную PATH, создайте временный файл с таким необычным именем, которое вы никогда не ожидали бы от другого файла на вашем компьютере.

  • Используйте стандартную конструкцию сценариев пакетной обработки, которая позволяет выполнять поиск файла, просматривая список каталогов, определенный некоторой переменной среды (обычно PATH).

  • Проверьте, соответствует ли результат поиска соответствующему пути, и покажите результат.

  • Удалить временный файл.

Это может выглядеть так:

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

Известные проблемы:

  • Метод может работать только в том случае, если каталог существует (что не всегда так).

  • Создание/удаление файлов в каталоге влияет на его атрибут "измененная дата/время" (иногда это может быть нежелательным эффектом).

  • Составление глобального уникального имени файла в одном уме нельзя считать очень надежным. Создание такого имени само по себе не является тривиальной задачей.

Ответ 15

Эта версия работает достаточно хорошо. Он просто проверяет, находится ли vim71 в пути, и добавляет его, если нет.

@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

Логика инвертируется в коде vim71, так как уровень ошибок 1 эквивалентен errorlevel >= 1. Из этого следует, что уровень ошибок 0 всегда будет оцениваться как true, поэтому используется < not errorlevel 1.

Postscript Проверка может не потребоваться, если вы используете setlocal и endlocal для локализации настроек вашей среды, например.

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

После endlocal вы вернетесь с исходным путем.

Ответ 16

Комментарий к "addPath" script; При поставке пути пробелами он подбрасывается.

Пример: вызов addPath "c:\Program Files (x86)\Microsoft SDK\Windows\v7.0A\Bin"

дает: "Файлы" не распознаются как внутренняя или внешняя команда, оперативной программы или командного файла.

Ответ 17

В общем, это нужно поставить exe/dll на путь. Пока этот файл не появится нигде:

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

Ответ 18

Это вариант ответа Кевина Эдвардса с использованием замены строки. Основной шаблон:

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

Например:

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

Вкратце, мы делаем условный тест, где мы пытаемся удалить/заменить new_path из нашей переменной среды PATH. Если new_path не существует, условие выполняется успешно, а new_path будет добавлено к PATH в первый раз. Если new_path уже существует, то условие не выполняется, и мы не будем добавлять new_path второй раз.

Ответ 19

Вы можете выполнить это с помощью PoweShell;

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

Это возвращает TRUE или FALSE

Короткий, простой и простой!

Ответ 20

Чтобы подробно описать Heyvoon (2015.06.08), используя Powershell, эта простая Powershell script должна дать вам подробную информацию о% 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

Ответ 21

Эта процедура будет искать путь\или 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

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