2015-02-01 5 views
2

Я пишу пакетный скрипт для редактирования переменной PATH. Часть моего пути состоит из переменных. Например:% JAVA_HOME%/bin. В стороне моего пакетного сценария я делаю следующее:Переменная Windows Batch, содержащая переменные

FOR %%A IN ("%PATH:;=";"%") DO ECHO %%A | FINDSTR /I /C:%stringToFind% >NUL && SET found=true || SET newPath=!newPath!;%%A 

Таким образом,% NEWPATH переменная% будет содержать все пути, которые я хочу сохранить.

Это хорошо, за исключением случаев, когда я сохраняю свой newPath в% PATH% используя SETX. Все мои переменные расширены. Итак, вместо% JAVA_HOME%/bin; Я получаю C: \ PROGRA ~ 1 \ Java \ jdk1.8.0_25 \ bin;

Мой вопрос заключается в том, как сохранить переменные в моем пути как переменные. Как получить пути без расширения переменных. Держите их как:% любых%. Я Googled безрезультатно. Любая помощь очень ценится.

+0

возможно дубликат [как избежать% в CMD Setx?] (Http://stackoverflow.com/questions/6399768/how-to-escape-at-cmd-setx) – famousgarkin

+1

Я видел этот пост. Моя проблема связана с переменными, содержащими переменные. % PATH% уже содержит переменные, поэтому пока я нахожусь в моем цикле for %% A - переменная, содержащая такую ​​строку:% JAVA_HOME%/bin; Проблема в том, что когда я пытаюсь сохранить эту строку или эхо, она оценивает значение переменной. Что такое C: \ PROGRA ~ 1 \ Java \ jdk1.8.0_25 \ bin; Я хочу сохранить его в первоначальной форме. – user1543871

+0

А, я вижу разницу сейчас, спасибо за разъяснение. – famousgarkin

ответ

2

Я мог ошибаться об этом, но я подозреваю, что часть вашей проблемы - это способ, которым %PATH% хранится в реестре. Тип значения - REG_EXPAND_SZ, который, как я предполагаю, расширяет все встроенные переменные во время определения %PATH%. Поэтому я подозреваю, что это в том, что независимо от того, какой метод поиска с помощью вы:

echo %PATH% 

setlocal enabledelayedexpansion 
echo !PATH! 

set PATH 

Все они отображаются каждую переменную PATH в пределах уже расширена.

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

@echo off 
setlocal 

for /f "tokens=2*" %%I in (
    'reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v path' 
) do set "HKLMpath=%%J" 

for /f "tokens=2*" %%I in (
    'reg query "HKCU\Environment" /v path 2^>NUL' 
) do set "HKCUpath=%%J" 

setlocal enabledelayedexpansion 
echo(!HKLMpath! 
if defined HKCUpath echo(!HKCUpath! 

А потом, до тех пор, пока вы сохраняете delayedexpansion стиль, вы можете оставить переменную компоненту нераспространенные.

Это половина ответа, во всяком случае. Мне не хочется возиться с моим% PATH% для дальнейшего тестирования, но вы можете найти this question useful, если у вас есть проблемы с setx и сдерживание ваших переменных.

+0

Работал шармом, спасибо. – user1543871

1

я сделал эксперимент с %PATH% и @rojo правильно - Вы не можете иметь переменные в %PATH%

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

Мне действительно не нравится одиночная командная строка FOR, но я оставил ее так, как вы начали с этого!

: Script to remove certain directories from the search path 
:: 
:: We need to use!! variable expansion 
setlocal enabledelayedexpansion 
:: Preset some variables for testing 
set stringToFind=D: 
:: newPath must be initialised to nothing before we start 
set newPath= 
:: Just for testing we could put a variable name in the path 
SET PATH=%%JAVA_THING%%;%PATH% 
:: The following loop fixes bugs with embedded quotes and spaces and too many ; 
FOR %%A IN ("%PATH:;=";"%") DO ECHO;%%A | FINDSTR /I /C:%stringToFind% >NUL && SET found=true || IF !newPath!. == . (SET newPath=%%~A) ELSE (SET newPath=!newPath!;%%~A) 
echo;!newPath! 
:: The echo will confirm the %variables% are in the path 
:: setx MYPATH "!newPath!" 
:: The above setx removes the %variables% from the PATH 
set path2=!newPath:%%=%%%%! 
echo;%path2% 
:: Now We can see the %'s are protected 
setx MYPATH "!path2!" 
:: But when we check the PATH in a new environment we cannot put invalid paths in place 
exit /b 
Смежные вопросы