2

メニューとコマンドのリストを含む .txt ファイルがあります。私ができるようにしたいのは、この .txt ファイルの各行を段階的に実行し、番号を確認して、前の値からインクリメントすることです。ファイルのセクションの例を次に示します。

menu1=do something
cmd1=cd \\somewhere
menu2=do something
cmd2=cd \\somewhere
menu3=do something
cmd3=cd \\somewhere
menu1=do something
cmd1=cd \\somewhere
menu2=do something
cmd2=cd \\somewhere
menu3=do something
cmd3=cd \\somewhere

メニュー番号が 1 から 3 までカウントされ、途中で再び 1 に戻ることに注目してください。

残念ながら、以下のようにインクリメントし続ける必要があります。

menu1=do something
cmd1=cd \\somewhere
menu2=do something
cmd2=cd \\somewhere
menu3=do something
cmd3=cd \\somewhere
menu4=do something
cmd4=cd \\somewhere
menu5=do something
cmd5=cd \\somewhere
menu6=do something
cmd6=cd \\somewhere

バッチファイルを使用してこれを実装する方法はありますか? 私はこれに慣れていませんが、文字列を解析し、数値を取得し、それを変数と比較してから置き換えるのは難しいことがわかりました。正しい方向に私を向けることができますか?ありがとうございました。

解決

setlocal DisableDelayedExpansion

set menuNr=1
(
  for /F "tokens=1,2* delims==" %%a in (MyFile.txt) do (
    set "prefix=%%a"
    set "rest=%%b"
    call :processLine
  ) 
)
move /y temp.txt MyFile.txt
exit /b

:processLine
setlocal EnableDelayedExpansion

if "!prefix:~0,4!"=="menu" (
  set "prefix=menu!menuNr!"
)
if "!prefix:~0,3!"=="cmd" (
  set "prefix=cmd!menuNr!"
  set /a menuNr+=1
)

echo !prefix!=!rest! >> temp.txt
(
endlocal
set "menuNr=%menuNr%"
exit /b
)
4

1 に答える 1

4

最初のステップは、コンテンツを誤って変更することなく、バッチでファイルを読み取ることです。
これは、遅延トグル技術で行うことができます。

次に、各行が「menu」または「cmd」で始まるかどうかを確認し、適切なメニュー エントリを作成します。
各「cmd」エントリの後、メニュー番号がインクリメントされます。

setlocal DisableDelayedExpansion

set menuNr=1
(
  for /F "tokens=1,2* delims==" %%a in (myMenu.txt) do (
    set "prefix=%%a"
    set "rest=%%b"
    call :processLine
  )
) > temp.txt
exit /b

:processLine
setlocal EnableDelayedExpansion

if "!prefix:~0,4!"=="menu" (
  set "prefix=menu!menuNr!"
)
if "!prefix:~0,3!"=="cmd" (
  set "prefix=cmd!menuNr!"
  set /a menuNr+=1
)

echo !prefix!=!rest!
(
endlocal
set "menuNr=%menuNr%"
exit /b
)
于 2012-05-08T18:01:21.743 に答える