BAT-файл: FOR %% x неверное расширение переменной - PullRequest
0 голосов
/ 26 января 2012

У меня есть bat-скрипт со следующим кодом:

FOR /F "tokens=1,2 delims==" %%g in ("%CFGFILE%") do (
  SET firstChar=%%g
  SET firstChar=!firstChar:~1,1!
  if /I "!firstChar!"=="#" (
    echo %%g>>"%INSTALL_PATH%\tmp.cfg"
  )else (
    if /I "%%g"=="document.folder" (
      SET path_written=TRUE
      echo %%g=%DOC_FOLDER%>>"%INSTALL_PATH%\tmp.cfg"
    )else (
      rem next line is buggy
      echo %%g=%%h>>"%INSTALL_PATH%\tmp.cfg"
    )
  )
)

Дело в том, что мы разбираем содержимое cfg-файла% CFGFILE% и копируем каждую строку без изменений в новый файл конфигурации, кроме только одной строки, начинающейся с «document.folder». Эта строка должна быть изменена. Проблема в том, что строка после комментария «следующая строка содержит ошибку» выдает «c: \ program files \ myApp \ original.cfg =», которая является содержимым переменной% CFGFILE% плюс знак равенства. Это ошибка или я сделал что-то не так? Связано ли это с %% x видимостью переменных?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Вы неправильно определили источник проблемы! : -)

Ваша проблема в самой первой строке - ваш оператор FOR обрабатывает строку, а не файл, потому что предложение IN () заключено в двойные кавычки. Если вы хотите, чтобы предложение IN () рассматривалось как имя файла в кавычках, вам нужно добавить USEBACKQ в ваши параметры FOR.

FOR /F "usebackq tokens=1,2 delims==" %%g in ("%CFGFILE%") do (

Просто на голову - даже после исправления, приведенного выше, ваш код не даст правильных результатов, если появится любое из следующих условий

  • Если какая-либо строка содержит !, то расширение %% g или %% h будет повреждено, поскольку включено отложенное расширение

  • Строка с комментариями # будет неполной, если оригинал содержал =

  • Ваши обычные строки не будут полными, если в оригинале есть 2-й =

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

Мое предложение:

Используйте FART ... http://sourceforge.net/projects/fart-it/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...