Mientras bucle en lote

Esto es lo que quiero, dentro de BACKUPDIR , quiero ejecutar cscript /nologo c:\deletefile.vbs %BACKUPDIR% hasta que el número de archivos dentro de la carpeta sea mayor que 21 (los countfiles lo tienen). Aquí está mi código:

 @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% ) 

 set /a countfiles-=%countfiles% 

Esto establecerá los archivos de conteo en 0. Creo que quieres disminuirlo en 1, así que utiliza esto en su lugar:

 set /a countfiles-=1 

No estoy seguro de si el bucle for funcionará, mejor intente algo como esto:

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

Un ciclo while se puede simular en cmd.exe con:

 :still_more_files if %countfiles% leq 21 ( rem change countfile here goto :still_more_files ) 

Por ejemplo, el siguiente script:

  @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 

productos:

 0 1 2 3 4 5 

Para su caso particular, comenzaría con lo siguiente. Tu descripción inicial fue un poco confusa. Supongo que desea eliminar archivos en ese directorio hasta que haya 20 o menos:

  @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 ) 

Fue muy útil para mí lo he usado de la siguiente manera para agregar usuarios en el directorio activo:

 :: 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 
 @echo off set countfiles=10 :loop set /a countfiles -= 1 echo hi if %countfiles% GTR 0 goto loop pause 

en el primer “conjunto de archivos de conteo”, el 10 que ve es la cantidad en la que se repetirá el eco, el hola es lo que desea repetir

… tengo 5 años de retraso

Se puede hacer con un do while ... enddo loop.