Batch file 批处理:在文本文件中重新排列编号

Batch file 批处理:在文本文件中重新排列编号,batch-file,text-manipulation,number-manipulation,Batch File,Text Manipulation,Number Manipulation,我有一个.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 some

我有一个.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
有没有一种方法可以使用批处理文件来实现这一点?我对这一点还不熟悉,但解析字符串、获取数字、将其与变量进行比较,然后替换它被证明是困难的。你能给我指一下正确的方向吗?多谢各位

解决方案
第一步是批量读取文件,而不会无意中修改内容。
这可以通过延迟切换技术完成

然后可以检查每一行是否以“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
)

第一步是批量读取文件,而不会无意中修改内容。
这可以通过延迟切换技术完成

然后可以检查每一行是否以“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
)

对这个问题的出色分析。注意:我会在末尾加一个:end和一个暂停,以使批处理文件在运行后可读。这真是一个很好的分析。我做了一些小的修改,将修改写入一个temp.txt文件,并重写了原来的文件,但除此之外,它是惊人的。谢谢大家!@Zachary Stade-您可以在for循环中更好地重定向它,如果
temp.txt
已经存在,则重定向速度会更快,并且不会出现问题。我把它添加到我的样本中,对这个问题进行了出色的分析。注意:我会在末尾加一个:end和一个暂停,以使批处理文件在运行后可读。这真是一个很好的分析。我做了一些小的修改,将修改写入一个temp.txt文件,并重写了原来的文件,但除此之外,它是惊人的。谢谢大家!@Zachary Stade-您可以在for循环中更好地重定向它,如果
temp.txt
已经存在,则重定向速度会更快,并且不会出现问题。我把它加到我的样品里了