批处理文件 FOR 循环改进

Posted

技术标签:

【中文标题】批处理文件 FOR 循环改进【英文标题】:Batch file FOR loop improvements 【发布时间】:2022-01-20 20:22:46 【问题描述】:

我们在产品中有代码,用于检查文件属性(check.bat file1.bin 的结果返回 0 或 1)并在必要时重新启动用户进程(如果返回 1,则重新启动进程)。代码工作正常,但我只是想问有没有办法用 FOR 循环来改进它,因为我们确实每个循环都做同样的事情,但是 +1 到用户名、任务名称和文件名

@echo off

:cycle1
FOR /F "tokens=* USEBACKQ" %%F IN (`check.bat file1.bin`) DO (SET var=%%F )
if %var% == 1 (taskkill /f /fi "USERNAME eq user1" & SCHTASKS /RUN /TN "task1")
goto cycle2

:cycle2
FOR /F "tokens=* USEBACKQ" %%F IN (`check.bat file2.bin`) DO (SET var=%%F )
if %var% == 1 (taskkill /f /fi "USERNAME eq user2" & SCHTASKS /RUN /TN "task2") 
goto cycle3

:cycle3
FOR /F "tokens=* USEBACKQ" %%F IN (`check.bat file3.bin`) DO (SET var=%%F )
if %var% == 1 (taskkill /f /fi "USERNAME eq user3" & SCHTASKS /RUN /TN "task3") 
goto eof

:eof
exit /b 0

【问题讨论】:

你想无限地增加数字,还是只循环从数字 1 到 3? 【参考方案1】:

您可以使用for /l 循环来增加文件编号。我还做了一些其他的小改动,让代码更简单,不需要那些代码块:

@echo off
for /l %%a in (1,1,3) do for /F "delims=" %%F IN ('check.bat "file%%a.bin"') do (
    if %%F equ 1 taskkill /f /fi "USERNAME eq user%%a" & SCHTASKS /RUN /TN "task%%a"
)

但是,我确信您的用户和任务没有被称为 user1,2,3task,1,2,3,因此您需要定义您的用户和任务变量,并且仍然使用数字增量来根据 bin 文件编号选择每个用途:

@echo off & setlocal enabledelayedexpansion
set "u1=Steven"
set "u2=Maddy"
set "u3=Dan"
set "t1=taskname1"
set "t2=taskname2"
set "t3=taskname3"
for /l %%a in (1,1,3) do for /F "delims=" %%F IN ('check.bat "file%%a.bin"') do (
    if %%F equ 1 taskkill /f /fi "USERNAME eq !u%%a!" & SCHTASKS /RUN /TN "!t%%a!"
)

【讨论】:

但我还没有测试过代码,但在我看来这是一个解决方案。谢谢你,@Gerhard!

以上是关于批处理文件 FOR 循环改进的主要内容,如果未能解决你的问题,请参考以下文章

批处理文件“for”循环 - 多行

批处理文件只运行一次,FOR循环出错

如何逐步在批处理文件中运行for循环

如何在批处理文件中使用for循环列出文件夹中所有文件和目录的名称

批处理:如何在 FOR 循环中附加字符串

ftp echo批处理命令,想要用for循环传递多个文件