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」が追加された行を出力し、それ以外の場合はその行を出力します

次に、tempfile を削除し、レポートを表示します。 元の MYFILE.INI を使用した 出力 NEWFILE.INI とそれらの違い。

検査中の行を一時ファイルに書き込むということは、バッチのリダイレクタである<やのような厄介な文字が適切に処理されることを意味します。>通常の方法は ですがECHO %%x|findstr...>パイプに詰まってエラー メッセージが漏れます。

唯一の問題は、空の行と、おそらく「;」で始まる行です。出力から削除されますが、スペースだけで構成される行は保持されます...

于 2013-03-23T05:09:06.637 に答える