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 回答