Как проверить, существует ли каталог в% PATH%? - PullRequest
58 голосов
/ 26 сентября 2008

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

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

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

Ответы [ 21 ]

2 голосов
/ 27 сентября 2008

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

1 голос
/ 06 мая 2017

Просто для уточнения ответа Heyvoon (2015.06.08) с использованием Powershell, этот простой скрипт 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
1 голос
/ 08 июня 2015

Вы можете сделать это с помощью PoweShell;

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

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

Коротко, просто и легко!

1 голос
/ 29 апреля 2014

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

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 во второй раз.

1 голос
/ 27 сентября 2008

Опираясь на ответ 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
1 голос
/ 13 июня 2012

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

@echo off
where /q <put filename here>    
if %errorlevel% == 1 (
    setx PATH "%PATH%;<additional path stuff>"
) else (
    echo "already set path"
)
1 голос
/ 14 декабря 2011

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

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

Выходы: «Файлы» не распознается как внутренняя или внешняя команда, работающая программа или командный файл.

1 голос
/ 01 октября 2008

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

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

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

1 голос
/ 07 октября 2011

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

1 голос
/ 07 апреля 2011

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

  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. Создание глобально уникального имени файла в уме не может считаться очень надежным. Создание такого имени само по себе не является тривиальной задачей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...