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

[prog] Как не нужно писать bat-файлы под Windows

Пару недель назад поставил себе Scala 2.7.7 “чисто попробовать” – пришлось исправлять евоный scala.bat-файл. Поматюгался на Unix-овых ламеров, которые под Windows фишку не рубят, да и забыл, не до Scala стало. А надысь потребовалось Maven2 себе поставить. И, сюрпрайз, сюрпрайз, там в mvn.bat точно такие же проблемы!

Дело вот в чем: со времен Windows 95 (когда мелкомягкая корпорация заложила очередную мину пользователям – разрешила пробелы в именах файлов) имена приходится заключать в кавычки для того, чтобы защититься от пробелов. Например, если в текущем каталоге есть файл с именем “tasks and plans.txt”, то чтобы просмотреть его содержимое в командной строке нужно будет вводить:

type “tasks and plans.txt”

или

notepad “tasks and plans.txt”

но не:

type tasks and plans.txt

поскольку в последнем случае type будет получать не один аргумент, а три -- “type”, “tasks”, “plans.txt”.

Авторы bat-файлов для Scala и Maven2 решили защищаться от пробелов в именах файлов по полной программе. Например, им нужно проверять значение переменной среды JAVA_HOME. Но, поскольку внутри ее значения могут быть пробелы, то проверку, по их замыслу, обязательно нужно защитить кавычками:

@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome

Но ирония в том, что это работает только для случая, когда в JAVA_HOME пробелов нет. А вот если есть, тогда указанный if раскрывается во что-то такое:

@REM ==== START VALIDATION ====
if not ""c:\Program Files\Java\jdk_16"" == "" goto OkJHome

И при исполнении bat-файла возникает ошибка, поскольку командный процессор видит набор независимых друг от друга фрагментов – “”, c:\Program, Files\Java\jdk_16“”. А возникает эта ошибка из-за того, что в JAVA_HOME уже есть свои кавычки вокруг значения. Поэтому лишняя перестраховка и обрамление %JAVA_HOME% дополнительными кавычками приводят к проблемам.

Пришлось править чужие bat-файлы вот так:

@REM ==== START VALIDATION ====
if not %JAVA_HOME%__ == __ goto OkJHome
Отправить комментарий