Пакетные файлы, Vista x64, если и скобки - PullRequest
7 голосов
/ 10 января 2009

Некоторые командные файлы в Windows используют синтаксис IF с несколькими строками, как показано ниже:

if var==rule (
  some comands
) else (
  else commands
)

Теперь Windows Vista x64 решила поместить все 32-битные файлы в «C: \ Program Files (x86)». К сожалению, всякий раз, когда вы используете переменную окружения (например, PATH) внутри многострочного IF без кавычек, скобка внутри значения переменной сбивает IF с толку, прерывая пакетный файл. Например:

if "%OS%"=="Windows_NT" (
  @setlocal
  call :set_home
  set _ARGS=%*
) else (
  set _SCALA_HOME=%SCALA_HOME%
  rem The following line tests SCALA_HOME instead of _SCALA_HOME, because
  rem the above change to _SCALA_HOME is not visible within this block.
  if "%SCALA_HOME%"=="" goto error1
  call :set_args
)

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

1 Ответ

9 голосов
/ 10 января 2009

Измените все экземпляры %SCALA_HOME% на !SCALA_HOME! и добавьте следующее в верхнюю часть файла:

setlocal enableextensions enabledelayedexpansion

Последнее включает «расширение с отложенной переменной», что означает, что переменные, записанные в форме !VAR!, не раскрываются до тех пор, пока они не будут использованы, а не когда синтаксический анализ самой инструкции. (В моем ограниченном опыте, и, конечно, в этом случае, это означает, что расширения переменных с меньшей вероятностью будут неверно истолкованы как фактические конструкции синтаксиса пакетных файлов.) Спасибо Патрику Каффу за указание этого лучшего способа сделать это в комментарии. *

P.S .: Как вы обнаружили, язык cmd.exe пакетных файлов ужасно сломан во многих отношениях. Если вы не можете использовать подлинный язык сценариев (например, если ваша задача должна выполняться на других компьютерах), я бы настоятельно рекомендовал отключить быстрый «сценарий» C / C ++, который выполняет эту работу, и скомпилировать его в .EXE.

...