同时批量循环

时间:2009-11-24 07:39:12

标签: windows batch-file for-loop while-loop

这是我想要的,在BACKUPDIR内,我想执行cscript /nologo c:\deletefile.vbs %BACKUPDIR%,直到文件夹中的文件数大于21(countfiles持有它)。 这是我的代码:

@echo off
SET BACKUPDIR=C:\test
for /f %%x in ('dir %BACKUPDIR% /b ^| find /v /c "::"') do set countfiles=%%x

for %countfiles% GTR 21 (
cscript /nologo c:\deletefile.vbs %BACKUPDIR%
set /a countfiles-=%countfiles%
)

5 个答案:

答案 0 :(得分:52)

set /a countfiles-=%countfiles%

这会将countfiles设置为0.我认为你想将它减少1,所以请改用它:

set /a countfiles-=1

我不确定for循环是否有效,最好尝试这样的事情:

:loop
cscript /nologo c:\deletefile.vbs %BACKUPDIR%
set /a countfiles-=1
if %countfiles% GTR 21 goto loop

答案 1 :(得分:45)

while循环可以在cmd.exe中使用:

进行模拟
:still_more_files
    if %countfiles% leq 21 (
        rem change countfile here
        goto :still_more_files
    )

例如,以下脚本:

    @echo off
    setlocal enableextensions enabledelayedexpansion
    set /a "x = 0"

:more_to_process
    if %x% leq 5 (
        echo %x%
        set /a "x = x + 1"
        goto :more_to_process
    )

    endlocal

输出:

0
1
2
3
4
5

对于您的具体情况,我将从以下开始。你的初步描述有点令人困惑。我假设您要删除该目录中的文件,直到20或更少:

    @echo off
    set backupdir=c:\test

:more_files_to_process
    for /f %%x in ('dir %backupdir% /b ^| find /v /c "::"') do set num=%%x
    if %num% gtr 20 (
        cscript /nologo c:\deletefile.vbs %backupdir%
        goto :more_files_to_process
    )

答案 2 :(得分:5)

@echo off

set countfiles=10

:loop

set /a countfiles -= 1

echo hi

if %countfiles% GTR 0 goto loop

pause

在第一个“设置计数文件”中,您看到的是它将循环的数量 echo hi是你要循环的东西

......我迟到了5年

答案 3 :(得分:2)

对我来说非常有用,我用以下方式在活动目录中添加用户:

:: This file is used to automatically add list of user to activedirectory
:: First ask for username,pwd,dc details and run in loop
:: dsadd user cn=jai,cn=users,dc=mandrac,dc=com -pwd `1q`1q`1q`1q

@echo off
setlocal enableextensions enabledelayedexpansion
set /a "x = 1"
set /p lent="Enter how many Users you want to create : "
set /p Uname="Enter the user name which will be rotated with number ex:ram then ram1 ..etc : "
set /p DcName="Enter the DC name ex:mandrac : "
set /p Paswd="Enter the password you want to give to all the users : "

cls

:while1

if %x% leq %lent% (

    dsadd user cn=%Uname%%x%,cn=users,dc=%DcName%,dc=com -pwd %Paswd%
    echo User %Uname%%x% with DC %DcName% is created
    set /a "x = x + 1"
    goto :while1
)

endlocal

答案 4 :(得分:2)

我有一个技巧,我想出了在CLI上执行While循环的方法,在该循环中无法使用上面提供的方法。

我将其称为“直到中断”循环:

FOR /L %L (0,0,1) DO @(ECHO. Your Code Here&( ECHO.Some more code here & echo. And here) )

这是一个无限循环,对于监视非常有用,您可以按CTRL + C断开它。

但是,我们也可以通过遇到某些类型的错误(例如,像写入不存在或只读的句柄那样)来过早地使FOR循环中断

将其转换为While循环

我们添加了一个针对预期结果的测试,并在满足条件时触发以下代码:

ECHO.>&3 >NUL

> NUL是可选的,我只是不想让它输出错误。

我希望在可能的情况下匹配inLine,如您在此经过清理的命令示例中所看到的那样,该命令用于监视VNX上的LUN迁移。

for /l %L IN (0,0,1) DO @(ECHO.& ECHO.===========================================&([Command to Check VNX LUN Migration] | FINDSTR /R /C:"Source LU Name" /C:"State:" /C:"Time " || echo >&3 )&Ping -n 10 1.1.1.1 -w 1000>NUL )