На главную
ПРАВИЛА 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%, мне надо заполучить эти значения в переменную окружения...
    aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
      Перед 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 строк обрабатывается около секунды!!!
        Мой вариант тоже не шустряк, но всё же быстрее. Однако ! нужно будет заменять уже на ^^!, символ ^ заменяется на ^^, а вот когда оба этих символа встречаются, тогда ^ нужно заменять аж на ^^^^. Жесть!
        aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
          Цитата Jin X @
          Проблема в твоём коде (да и в моём, и в других, которые предлагают) с обработкой символов ! и ^, но это можно решить вот так:
          Там в любом случае проблема, ^ либо удваивается, либо интерпретируется, как экранирующий. В результате невозможно обработать список файлов, если в каком-то из имён есть ^.
          Поэтому собираюсь переписать свои скрипты на Питон. Там этих текстовых макроподстановок нет.
          Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0813 ]   [ 17 queries used ]   [ Generated: 13.08.20, 07:37 GMT ]