0

私はバッチ スクリプトを作成する初心者であり、これに関するあなたの助けには非常に感謝しています。

以下はxmlで、フラグが「オン」になっているすべての名前をtxtファイルに抽出する必要があります。他にもいくつかのカテゴリ タグ インスタンスがあります。

<Head>
   <Category
      name="RIVERTD"
      flag="on"
      location="SG002">
    </Category>
   <Category
      name="BRETRED"
      flag="on"
      location="IT213">
    </Category>
   <Category
      name="AMERAND"
      flag="off"
      location="US212">
   </Category>
</Head>

だから、私が探している出力は以下のとおりです

RIVERTD
BRETRED

以下のコードを使用してみました

@echo off
setlocal disableDelayedExpansion
set input="CP.xml"
set output="Names.txt"

if exist %output% del %output%
for /f "delims=" %%A in ('findstr /n /c:"name=" %input%') do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  call :parseLine
  endlocal
)
type %output%
exit /b

:parseLine
set "ln2=!ln:*name=!"
if "!ln2!"=="!ln!" exit /b
for /f tokens^=2^ delims^=^" %%B in ("!ln2!") do (
  setlocal disableDelayedExpansion
  >>%output% echo(%%B
  endlocal
)
set "ln=!ln2!"
goto :parseLine

これで結果が得られます

RIVERTD
BRETRED
AMERAND

ただし、このコードはフラグに基づいて名前をフィルタリングしません。私は初心者です。フラグに基づいてフィルターを追加するのを手伝ってください。どうもありがとう。

4

3 に答える 3

1

この問題は、非常に興味深いトリックで解決できます!:

@echo off
setlocal EnableDelayedExpansion
(for /F "tokens=1,2 delims== " %%a in (CP.xml) do (
   if "%%~b" neq "" set %%a=%%~b
   if /I "!flag!" equ "on" echo !name!& set flag=
)) > Names.txt

編集いくつかの説明が追加されました

ファイルにはいくつかの行がありますが、OP は次のような割り当ての形式を持つ行を探します。

  name="RIVERTD"
  flag="on"

  name="BRETRED"
  flag="on"

  name="AMERAND"
  flag="off"

私のプログラムは名前をチェックしませんが、等号の後に値が割り当てられている行を実行します。このように、私のプログラムが前の行を処理するとき、結果は次のコマンドを実行するのと同じです:

  set name="RIVERTD"
  set flag="on"

  set name="BRETRED"
  set flag="on"

  set name="AMERAND"
  set flag="off"

その後、FLAG 変数の値が「オン」になっているかどうかを確認します。その場合、NAME 変数は前の行で割り当てられているため、ターゲット値を持っています。

アントニオ

于 2012-12-17T02:22:19.343 に答える
1

これでうまくいくはずです。

@echo off
setlocal enabledelayedexpansion

set "Name="
set "Flag="
set "Output=Names.txt"

for /f "usebackq delims=" %%L in (`type "CP.xml"`) do (
    for /f "usebackq tokens=1,2* delims=    =<> " %%A in ('%%L') do (
        if /i "%%~A"=="name" set "Name=%%~B"
        if /i "%%~A"=="flag" set "Flag=%%~B"
        if /i "%%~A"=="/category" (
            if /i "!Flag!"=="on" echo.!Name!>>%Output%
            set "Name="
            set "Flag="
        )
    )
)

endlocal
pause
于 2012-12-17T01:21:28.063 に答える