На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania 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%, мне надо заполучить эти значения в переменную окружения...
    vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
      Перед 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 строк обрабатывается около секунды!!!
        Мой вариант тоже не шустряк, но всё же быстрее. Однако ! нужно будет заменять уже на ^^!, символ ^ заменяется на ^^, а вот когда оба этих символа встречаются, тогда ^ нужно заменять аж на ^^^^. Жесть!
        vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
          Цитата Jin X @
          Проблема в твоём коде (да и в моём, и в других, которые предлагают) с обработкой символов ! и ^, но это можно решить вот так:
          Там в любом случае проблема, ^ либо удваивается, либо интерпретируется, как экранирующий. В результате невозможно обработать список файлов, если в каком-то из имён есть ^.
          Поэтому собираюсь переписать свои скрипты на Питон. Там этих текстовых макроподстановок нет.
          Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0897 ]   [ 18 queries used ]   [ Generated: 26.09.18, 07:05 GMT ]