从批处理脚本更改ini文件中的标志

时间:2018-12-14 08:02:04

标签: batch-file

我有一个脚本,它将检查文件名和文件内容是否相同,下面是代码,它工作正常

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 :(得分:0)

您可以尝试使用replacer.bat

call replacer.bat move.dat "flag = 0" "flag = 1"

答案 1 :(得分:0)

使用由 Dave Benham 编写的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 -

批处理文件首先检查是否完全存在要修改的文件,如果此条件不成立,则立即退出,请参见Where does GOTO :EOF return to?

批处理文件 JREPL.BAT 必须与具有上述代码的批处理文件存储在同一目录中。因此,该批处理文件将检查 JREPL.BAT 是否确实存在于该批处理文件的目录中,如果此条件不成立,则退出。

正则表达式搜索字符串的含义是:

  • ^ ...在一行的开头找到
  • ( ... ) ...在用$1替换字符串中引用的字符串,以使找到的字符串的这一部分保持不变
  • flag ...区分大小写的字符串flag
  •  * ...带有0个或多个空格
  • = ...和等号
  •  * ...以及0或多个空格
  • 0 ...和字符0

替换字符串使用0向后引用在行首和字符$1之间找到的字符串,并将0替换为1

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • call /? ...也解释了%~dp0 ...驱动器和参数0的路径,该参数和批处理文件路径始终以反斜杠结尾。
  • echo /?
  • goto /?
  • if /?
  • jrepl.bat /?

答案 2 :(得分:0)

![enter image description here :: 1st 需要在字符串中删除一些可能的空间以提高精度            比较它们时:flag = 0将变为flag=0,否             space ,没有 tab

:: 第二,为此,请使用此 "' (2个字符)来设置一个变量            使用“ = ”来字符串化而不是特殊的字符,            由 set "'=flag=0(非常古老的技术!)

:: 第3 次,请稍等,将制表符删除,因为有些时候            这是一个看不见的可能的角色,最终可能会发生            在文件dat中,请参见此问题10878138

:: 第4 个字符串,逐个文件,逐行比较字符串...

:: 精确您需要在文件(.dat或.ini)中替换行,这部分确实让我感到困惑,但是上面的代码对不起,如果出现我的错误!

obs:将此flag = 0的转换与此flag=0一起使用,仅用于处理比较操作, %%i 匹配标志= 0,然后仅更改为用标志= 1替换为文件,蝙蝠,这里要特别说明的是,命令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_:

因此对不起,关于我的英语