Изменение флага в INI-файле из пакетного скрипта - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть скрипт, который будет проверять, совпадают ли имена файлов и содержимое файлов, ниже приведен код, и он работает нормально

ECHO OFF
CLS
for %%i in (C:\Users\f1ym41a\Documents\deep\*.DAT) do (
fc C:\Users\f1ym41a\Documents\deep\MOVE.DAT %%i > NUL
if errorlevel 1 (
        CALL :error
        echo C:\Users\f1ym41a\Documents\deep\MOVE.DAT and %%i are different >>output.log
    ) ELSE (
        CALL :next
        echo C:\Users\f1ym41a\Documents\deep\MOVE.DAT and %%i are same >>output.log
    )
timeout 5
)
PAUSE

Что мне нужно сделать, еслиимена файлов совпадают, тогда он изменит флаг в INI-файле на 1. Ниже приведен INI-файл (deep.ini)

[INI]
flag = 0

Поскольку я новичок в пакетном скриптинге.Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Это легко достижимая задача с использованием JREPL.BAT , написанного Дейвом Бенхамом , который представляет собой гибрид пакетного файла / JScript для выполнения замены регулярного выражения в файле с использованием JScript..

@echo off
if not exist "%USERPROFILE%\Documents\deep\MOVE.DAT" goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF

call "%~dp0jrepl.bat" "^(flag *= *)0" "$11" /F "%USERPROFILE%\Documents\deep\MOVE.DAT" /O -

Пакетный файл сначала проверяет, существует ли вообще изменяемый файл, и сразу же завершает работу, если это условие не выполняется, см. Куда возвращается GOTO: EOF?

Пакетный файл JREPL.BAT должен храниться в том же каталоге, что и пакетный файл с кодом выше.По этой причине пакетный файл проверяет следующее, действительно ли JREPL.BAT существует в каталоге пакетного файла, и завершает работу, если это условие не выполняется.

Значение строки поиска регулярного выражения::

  • ^ ... найти в начале строки
  • ( ... ) ... строка, указанная в строке замены, с $1чтобы сохранить эту часть найденной строки неизменной
  • flag ... с учетом регистра строки flag
  • * ... с 0 или более пробелами
  • = ... и знак равенства
  • * ... и еще раз 0 или более пробелов
  • 0 ... и символ 0.

Строка замены возвращает ссылку на найденную строку между началом строки и символом 0 на $1 и заменяет 0 на 1.

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

  • call /? ... объясняет также %~dp0 ... диск и путь аргумента 0, который является путем к пакетному файлу, всегда заканчивающемуся обратной косой чертой.
  • echo /?
  • goto /?
  • if /?
  • jrepl.bat /?
0 голосов
/ 17 декабря 2018

![enter image description here :: 1-й необходимо удалить некоторые возможные пробелы в строке, чтобы получить больше точности при их сравнении: "flag = 0" станет "flag=0" , нет space и нет tab.

:: 2-й длячтобы сделать это, используйте "' (2 символа), чтобы установить переменную, которая использует " = " для строки вместо специальный символ , set "'=flag=0 " (очень старый технический!)

:: 3-й равный, обработать символ табуляции и удалить его, потому что некоторое времяэто невидимый и возможный символ, который в конечном итоге может появиться в файле данных, см. в этом вопросе 10878138

:: 4-й Сравнение строк за строкой из файла за файлом, строка за строкой ...

:: точно Вам нужно заменить строку в файле (.dat или .ini), эта часть меня действительно смущает, но код приведен выше,извините, если моя ошибка!

Obs: используйте преобразование этого "flag = 0" вот этот "flag=0" , только для обработки сравнительных операций, подменим флаг соответствия %%i = 0, затем изменим только назамените файлы на flag = 1, bat, особая вещь здесь - команда fc сравнивает %% i по тому же файлу в цикле for с другим файлом.

@echo off && setlocal EnableExtensions EnableDelayedExpansion

set "'=flag=0"
set _file_new_flag1="%temp%\Flag1.dat"
set _path_to_dats=C:\Users\f1ym41a\Documents\deep\

for /f "delims= " %%T in ('forFiles /p "." /m "%~nx0" /c "cmd /c echo(0x09"') do set "_tab=%%T"

type nul >output.log && set "_tab=%_tab:~0,1%"

cd /d "!_path_to_dats!"

for /f "tokens=* delims= " %%x in ('dir /o-d /on /b "*.dat"') do (

     if defined _file_new_flag ( 

         move /y "!_file_new_flag1!" "!_file_now!"

         set _file_now=<nul
         set "_file_now=%%~x"

        ) else (

         set "_file_now=%%~x"

        )

     call :_file_compare_:

    )

 endlocal & goto :_end_of_file_:

 :_file_compare_:

 for /f "tokens=* delims= " %%X in ('type "!_file_now!"') do (

     for /f "tokens=* delims= " %%i in ('echo/"%%~X"') do (

         set "_to_compare=%%~i"

         call set "_to_compare=!_to_compare: =!"

         for /f "tokens=* delims=" %%I in ('echo/%_tab%') do call set "_to_compare=!_to_compare:%%I=!"

         if ["!_to_compare!"] equ ["%'%"] ( 

             echo/C:\Users\f1ym41a\Documents\deep\MOVE.DAT and %%i are same >>output.log
             echo/%%~i>>!_file_new_flag1!

            ) else (

             echo/C:\Users\f1ym41a\Documents\deep\MOVE.DAT and %%i are different >>output.log
             echo/flag = 1>>!_file_new_flag1!

            )

         timeout /t 5

         set _to_compare=<nul

        ) 

    ) 

exit /b 

:_end_of_file_:

Итак извините о моем английском .

0 голосов
/ 14 декабря 2018

Вы можете попробовать с replacer.bat :

call replacer.bat move.dat "flag = 0" "flag = 1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...