0

我对命令脚本完全陌生,可以使用一些指导......

我需要检查 .ini 文件中的某一行是否存在,但我只知道该行的哪一部分。如果它存在,我知道它将以字符串“Extmgr_Addins=”开头,并且它可以具有任意数量的逗号分隔字符串值。

如果我找到这一行,我需要查看是否包含子字符串“mc”。如果它已经有“mc”,那么什么也不做。如果没有,我需要将字符串“,mc”附加到该行的末尾。这是我到目前为止所拥有的:

for /f "TOKENS=*" %%x in (myFile.ini) do (

set line=%%x
set line=!tst:Extmgr_Addins!

if not !line!==%%x ( 
     REM matched string ExtMgr_Addins
   set hasMC = %%x
   set hasMC=!hasMC:mc!

   if not !line!==%%x (

        REM matched substring of mc - do nothing

        )else(

                         REM here is where I would append "mc" to this line                 
        )
            )
4

1 回答 1

2
@ECHO OFF
SETLOCAL
:temploop
(SET tempfile="%temp%\temp%random%.#$#")
IF EXIST %tempfile% GOTO temploop

(FOR /f "delims=" %%x IN (myfile.ini) DO (
>%tempfile% ECHO %%x
 FINDSTR /b "Extmgr_Addins=" <%tempfile% >NUL
 IF ERRORLEVEL 1 (ECHO.%%x) ELSE (
  FIND "mc" <%tempfile% >NUL
  IF ERRORLEVEL 1 (ECHO %%x,mc) ELSE (ECHO %%x)
 )
)
)>newfile.ini
DEL %tempfile%

ECHO ==== original file =====
type myfile.ini
ECHO ==== modified file =====
type newfile.ini
ECHO ==== differences =====
FC myfile.ini newfile.ini
ECHO ==== end of report =====


GOTO :eof

结果:

tempfile="c:\temp\temp8291.#$#"
==== original file =====
notthisline
Extmgr_Addins=notargetstring
Extmgr_Addins=mchastargetstring
Extmgr_Addins=hastargetatendmc
 Extmgr_Addins=notbeginsnotargetstring
 Extmgr_Addins=notbeginsmchastargetstring
 Extmgr_Addins=notbeginshastargetatendmc
mcinthisline
thislinehasmctoo
andat the end mc
mc and Extmgr_Addins=
Extmgr_Addins=finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}"
Extmgr_Addins=mc finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}"
==== modified file =====
notthisline
Extmgr_Addins=notargetstring,mc
Extmgr_Addins=mchastargetstring
Extmgr_Addins=hastargetatendmc
 Extmgr_Addins=notbeginsnotargetstring
 Extmgr_Addins=notbeginsmchastargetstring
 Extmgr_Addins=notbeginshastargetatendmc
mcinthisline
thislinehasmctoo
andat the end mc
mc and Extmgr_Addins=
Extmgr_Addins=finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}",mc
Extmgr_Addins=mc finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}"
==== differences =====
Comparing files myfile.ini and NEWFILE.INI
***** myfile.ini
notthisline
Extmgr_Addins=notargetstring
Extmgr_Addins=mchastargetstring
***** NEWFILE.INI
notthisline
Extmgr_Addins=notargetstring,mc
Extmgr_Addins=mchastargetstring
*****

***** myfile.ini
mc and Extmgr_Addins=
Extmgr_Addins=finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}"
Extmgr_Addins=mc finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}"
***** NEWFILE.INI
mc and Extmgr_Addins=
Extmgr_Addins=finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}",mc
Extmgr_Addins=mc finally !@#$%^&*()_+|\=-0<>,./?:;'[]{}"
*****

==== end of report =====

前几行处理建立一个有效的临时文件名。

然后我们

  1. 读一行
  2. 将其转储到临时文件中
  3. 检查以目标字符串开头的行
  4. 如果未找到(错误级别 1) ECHO 该行
  5. 如果找到(不是错误级别 1,因此错误级别为 0)
  • 检查是否存在“mc”
  • 如果找不到,则输出附加“,mc”的行,否则只输出该行

然后删除临时文件并显示一个报告: 原来的MYFILE.INI 使用了输出NEWFILE.INI 和它们之间的区别。

将正在检查的行写入临时文件意味着可以正确处理像<和批量重定向器这样的尴尬字符。>正常的方法是卡在管道中ECHO %%x|findstr...>泄漏错误消息。

关于唯一的问题是空行和可能以';'开头的行 将从输出中删除,但将保留包含唯一空格的行...

于 2013-03-23T05:09:06.637 回答