使用循环时遇到问题。我想要做的是通过在每次迭代中在文件名末尾添加数字“N”来更改文件名,例如file1
,file2
,file3
,...所以它不应该覆盖以前的文件名。
set path=D:\MeasurementData\%~n0%
echo %path%
pause
for /L %%N in (1,1,5) do (
set file="%path%%%N"
echo %file%
pause
start C:\TomoK.exe %file% "D:\MParameter.mff" "D:\MParameter.mcf"
Pause
)
有谁知道如何解决这个问题?
答案 0 :(得分:0)
我的第一个建议是永远不会替换像PATH
这样的预定义环境变量,除非有充分的理由去做。打开命令提示符窗口并运行set
以使用其当前值输出所有预定义变量。或者查看有关环境变量的维基百科文章Windows Environment Variables一章,并阅读What is the reason for '...' is not recognized as an internal or external command, operable program or batch file?
我的第二个建议是需要帮助建议打开一个命令提示符窗口并运行批处理文件中使用/?
作为参数的每个命令,如set /?
。然后在一个或多个可以研究的页面上输出命令的帮助。如何使用延迟扩展以及必须使用何时使用 IF 上的命令 SET 和 FOR 强>例子。有关编写批处理文件的其他有用页面是Microsoft's command-line reference和SS64.com - A-Z index of the Windows CMD command line。
我的第三个建议是阅读How to set environment variables with spaces?上的答案以及与之相关的其他Stack Overflow问题。下半部分位于this answer,其中包含有关命令 SETLOCAL 和 ENDLOCAL 的详细信息。
在研究了所有这些帮助和网页之后,理解这段代码应该没有问题了:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "DataPath=D:\MeasurementData\%~n0"
for /L %%N in (1,1,5) do (
set "DateFile=%DataPath%%%N"
echo !DateFile!
pause
C:\TomoK.exe "!DateFile!" "D:\MParameter.mff" "D:\MParameter.mcf"
pause
)
endlocal
我不知道为什么使用命令 START 来运行可执行文件TomoK.exe
,因此将其删除。
但是,批处理文件也可以在没有延迟扩展的情况下编写,因为环路变量DataFile
根本不需要在循环体中。并且上面的整个批处理代码可以优化为批处理文件中的单个命令行:
@for /L %%N in (1,1,5) do @C:\TomoK.exe "D:\MeasurementData\%~n0%%N" "D:\MParameter.mff" "D:\MParameter.mcf"
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
pause /?
set /?
setlocal /?
start /?