На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Jin X
  
> Чтение настроек из файла
    Вот такой код позволяет читать данные из cfg-файла:
    ExpandedWrap disabled
      for /f "eol=# delims== tokens=1*" %%i in (%~dpn0.cfg) do (
          set %%i=%%j
      )
    записанные в таком формате:
    ExpandedWrap disabled
      # это коммент
      mainpath=%ProgramFiles(x86)%\MyDir
      mainexe=MyProg.exe

    Но тут есть проблема.
    Мы получаем переменные окружения со значениями:
    mainpath=%ProgramFiles(x86)%\MyDir
    mainexe=MyProg.exe

    Т.е. как есть. Строка "%ProgramFiles(x86)%" не раскрывается в "C:\Program Files (x86)"
    Соответственно if exist %mainpath%\%mainexe% set found=1 не сработает.

    Что можно изменить в этом коде, чтобы %-переменные раскрывались?
    p.s. Мне не нужно просто вывести на экран значение через cmd /c echo %mainpath%, мне надо заполучить эти значения в переменную окружения...
      Перед set напиши call. Тогда произойдёт две подстановки.
      И появится ещё одна иногда полезная штука - в именах параметров тоже можно будет использовать переменные окружения

      Я кстати пишу немного проще:
      ExpandedWrap disabled
        for /f "eol=# delims=" %%i in (%~dpn0.cfg) do call set %%i
        amk, отлично, спасибо. А то я уже вот так хотел сделать:
        ExpandedWrap disabled
          @echo off
          setlocal EnableExtensions EnableDelayedExpansion
           
          for /f "eol=# delims== tokens=1*" %%i in (%~dpn0.cfg) do (call :Do set %%i=%%j&echo !%%i!)
          exit /b
           
          :Do
          %*&exit /b

        :)

        Проблема в твоём коде (да и в моём, и в других, которые предлагают) с обработкой символов ! и ^, но это можно решить вот так:
        ExpandedWrap disabled
          @echo off
          for /f "eol=# delims== tokens=1*" %%i in (%~dpn0.cfg) do (call set %%i=%%j)
          setlocal EnableExtensions EnableDelayedExpansion
          if exist "%mainpath%\%mainexe%" echo OK

        А в конфиге для файла с именем My^Prog!.exe писать так:
        ExpandedWrap disabled
          # Settings
          mainpath=%ProgramFiles(x86)%\MyDir
          mainexe=My^^Prog^!.exe


        Добавлено
        Попробовал сейчас... пипец как долго работает эта конструкция!!!
        Файл на 125 строк обрабатывается около секунды!!!
        Мой вариант тоже не шустряк, но всё же быстрее. Однако ! нужно будет заменять уже на ^^!, символ ^ заменяется на ^^, а вот когда оба этих символа встречаются, тогда ^ нужно заменять аж на ^^^^. Жесть!
          Цитата Jin X @
          Проблема в твоём коде (да и в моём, и в других, которые предлагают) с обработкой символов ! и ^, но это можно решить вот так:
          Там в любом случае проблема, ^ либо удваивается, либо интерпретируется, как экранирующий. В результате невозможно обработать список файлов, если в каком-то из имён есть ^.
          Поэтому собираюсь переписать свои скрипты на Питон. Там этих текстовых макроподстановок нет.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0217 ]   [ 17 queries used ]   [ Generated: 19.03.24, 02:56 GMT ]