我正在尝试向文本文件添加迭代以保存输出数字,而不是覆盖它以保留迭代。
我可以编写第一个迭代编号,但它不会添加后面的数字。
我有一个文本文件,其中迭代编号为 1
。
迭代.txt
1
到目前为止,我的批处理代码看起来像这样。
REM Run model outputs
set "iter="
for /F "delims=" %%i in (iteration.txt) do if not defined iter set "iter=%%i"
copy .\run1_Diagnostics.csv storefilesfolder\%itera%_Diagnostics.csv
echo %iter%+1 >iteration.txt
问题是它只是将文本文件覆盖为 +1 或 +1 +1 +1 +1 并且不添加数字。
最佳答案
我建议使用此代码:
REM Run model outputs
if not exist iteration.txt set "iter=1" & goto CopyFile
set "iter="
for /F "delims=" %%i in (iteration.txt) do if not defined iter set "iter=%%i"
set /A iter+=1
:CopyFile
copy run1_Diagnostics.csv storefilesfolder\%iter%_Diagnostics.csv
>iteration.txt echo %iter%
还有另一种方法可以读取文本文件的第一行并将其分配给环境变量:
REM Run model outputs
if not exist iteration.txt set "iter=1" & goto CopyFile
set "iter="
set /P iter=<iteration.txt
set /A iter+=1
:CopyFile
echo copy run1_Diagnostics.csv storefilesfolder\%iter%_Diagnostics.csv
>iteration.txt echo %iter%
两个批处理文件首先检查当前目录中是否存在文件 iteration.txt
。
如果文件不存在,则使用值 iter
定义环境变量 1
。
否则,使用命令 FOR 从文件中读取第一行并将其分配给环境变量 iter
,或者在提示输入环境变量值时使用命令 SET从文件中进行输入重定向strong> 带有选项 /P
。
使用带有选项 /A
的命令 SET 从文件中读取的值会增加 1,这意味着环境变量 iter
的新值是算术表达式的结果。 set /A
是 Windows 命令行解释器支持的唯一对 32 位带符号整数值执行简单数学或二进制运算的方法。如果从文件读取的字符串不是有效的 32 位带符号整数,则 iter
的值为 1
。
接下来,使用初始值 1
或从文件 iteration.txt
读取的值加一来复制文件。
.\
并不是真正需要指定当前目录。如果文件或文件夹位于当前目录中,则可以安全地省略这两个字符。
最后一个命令行输出当前迭代值以处理STDOUT,该值将重定向到正在创建的文件或覆盖已存在的文件。
重定向运算符和文件名在此处指定给命令 ECHO,该命令输出数字,因为 echo %iter%>iteration.txt
不适用于 1
到 9
的数字。并且使用 echo %iter% >iteration.txt
也会将数字和重定向运算符 >
之间的空格字符作为尾随空格写入文件中,此处应避免这种情况。
为了了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
-
copy /?
-
echo /?
-
for /?
-
goto /?
-
if /?
-
rem /?
-
set /?
另请阅读有关 Using Command Redirection Operators 的 Microsoft 文章,了解重定向运算符 <
和 >
的说明,并阅读 single line with multiple commands using Windows batch file 了解运算符 &
的说明。
关于batch-file - 将迭代添加到批处理文件中的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742319/