barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

понедельник, 11 марта 2013 г.

cmd: Скобки в значениях переменных и группировки в if

Проблема:

В bat-нике есть некоторая переменная, значение которой содержит скобки. В моем случае переменная эта была CLASSPATH, и содержала она строку "C:/Program Files (x86)/IBM/WebSphere MQ/Java/lib/com.ibm.mq.jar". В bat-нике эта переменная используется следующим образом (в моем случае батником был стартовый скрипт Oracle Weblogic 10.3.5):
if NOT "%PRE_CLASSPATH%"=="" (
set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%
)
, т.е. для группировки используются круглые скобки.
При попытке выполнить bat-ник валится ошибка:
set CLASSPATH=;C:/Program Files (x86)/IBM/WebSphere MQ/Java/lib/com.ibm.mq.jar

/IBM/WebSphere was unexpected at this time.
Причина:

При раскрытии переменной присутствующая в ней закрывающая скобка воспринимается интерпретатором как закрытие группировки после "if", а остаток строки интерпретируется как следующая команда ("/IBM/WebSphere...").

Решение:

Использовать отложенное раскрытие проблемной переменной, заключив её в "!" вместо "%". В таком случае значение переменной будет подставляться в команду при непосредственном её выполнении и уже не будет приводить к ситнаксическим ошибкам:
if NOT "%PRE_CLASSPATH%"=="" (
set CLASSPATH=%PRE_CLASSPATH%;!CLASSPATH!
)
Правда, перед этим нужно это самое отложенное раскрытие разрешить:
setlocal enabledelayedexpansion
Спасибо http://stackoverflow.com/questions/2410501/parenthesis-in-windows-cmd-script-variable-values-not-allowed.

Комментариев нет:

Отправить комментарий