Пакетный поиск строк в Windows PATH - PullRequest
4 голосов
/ 12 июля 2011

Я пишу командный файл в Windows для запуска сценариев после установки, и одна из вещей, которую необходимо сделать, - добавить каталог в системный путь.

Сценарий работает, ион делает что-то вроде этого:

setx Path "%PATH%;c:\path\to\add" -m

Это правильно устанавливает путь, но этот сценарий может потенциально выполняться несколько раз, если пользователь переустанавливает программу.

Я хотел бы найти в строке c:\path\to\add, поэтому я не продолжаю добавлять один и тот же путь снова и снова к системному пути.Это довольно тривиально в Linux с sed, но я не знаю, что это за команда в Windows.Я обнаружил findstr, но, похоже, это работает только с файлами.

Возможно ли это в Windows без установки дополнительного программного обеспечения?

РЕДАКТИРОВАТЬ:

Я использую Inno Setup для создания исполняемого файла установки.

Ответы [ 5 ]

2 голосов
/ 12 июля 2011

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

set str=%path%
:: str is the same with path

set str=%str:;C:\Path\To\Add=%
:: ";c:\path\to\add" is now removed from str

setx Path "%str%;c:\path\to\add" -m
:: proceed with setting the path

Это несет в себе риск удаления строки, если она на самом деле является частью пути, например c:\path\to\add\somefolder.Также, если путь на самом деле заканчивается \, или это первая запись, и он фактически не начинается с ; и т. Д.

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

set str=%str:;C:\Path\To\Add\;=;%
set str=%str:;C:\Path\To\Add;=;%
set str=%str:;C:\Path\To\Add\=%
set str=%str:C:\Path\To\Add\;=%
set str=%str:;C:\Path\To\Add=%

Но, ААМОФ, я не уверен, что это нормальный способ сделать это ..

1 голос
/ 15 марта 2017

У утилиты setx есть недостаток: она не может обрабатывать переменные, длина которых превышает 1024 символа.

Мне написан скрипт для обработки случаев, превышающих ограничение, и без необходимости устанавливать что-либо.Ответ на вопрос здесь: Установить переменные окружения с NSIS в окне 7

1 голос
/ 28 июня 2013

Это мой фрагмент кода для поиска пути "cvsnt" в переменной PATH.

if not "x%PATH:cvsnt=%" == "x%PATH%" goto proceed
set PATH=w:\build-repository\cvsnt\2.5.03-2382;%PATH%
echo Path added
:proceed

Часть, на которую нужно посмотреть:

not "x%PATH:cvsnt=%" == "x%PATH%"

Сначала я заменяю все вхождения"cvsnt" с пустой строкой.Результат сравнивается с PATH без замены "cvsnt".Если они не равны из-за того, что "cvsnt" был заменен, тогда он существует в PATH, и код может продолжить .

Начальный x перед% PATH% является только заполнителем для защиты от некоторых "неправильных" начальных символов.см. Пакетный файл: Найти, находится ли подстрока в строке (не в файле)

0 голосов
/ 18 мая 2012

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

  1. Поиск в PATH
  2. Условно добавьте в PATH

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

echo %PATH% > myTmpPath.tmp
find /C /I "c:\path\to\add" myTmpPath.tmp
if %ERRORLEVEL% neq 0 setx PATH "%PATH%;c:\path\to\add"
del myTmpPath.tmp

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

Третья строка - единственная хитрая.По сути, эта строка проверяет результат выполнения команды FIND выше. Роб ван дер Вуде заявляет :

FIND возвращает уровень ошибки 1 или выше, если строка поиска не найдена.

Он также объясняет :

Некоторые исполняемые файлы возвращают отрицательные числа для уровней ошибок!Однако это можно исправить, используя следующий код для проверки ненулевых кодов возврата:
IF% ERRORLEVEL% NEQ 0 ...

0 голосов
/ 03 января 2012

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

for %f in (cmd.exe) do if [%~$PATH:f]==[] setx Path "%PATH%;c:\path\to\add" -m

Обязательно отметьте for /?, чтобы узнать больше о магии %~$PATH:f.

...