2009-11-24 7 views
31

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

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

¿Cuál es su pregunta? ¿Funciona este lote o su problema es que está roto? – schnaader

Respuesta

41
set /a countfiles-=%countfiles% 

Esto establecerá countfiles a 0. Creo que quiere disminuir por 1, a fin de utilizar esto en su lugar:

set /a countfiles-=1 

no estoy seguro de si el bucle funcionará, mejor probar algo como esto:

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

Un bucle while puede simularse en cmd.exe con:

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

Por ejemplo, el siguiente script:

@echo off 
setlocal enableextensions enabledelayedexpansion 
set /a "x = 0" 
:while1 
    if %x% leq 5 (
     echo %x% 
     set /a "x = x + 1" 
     goto :while1 
    ) 
endlocal 

salidas:

0 
1 
2 
3 
4 
5 

Para su caso particular, comenzaría con lo siguiente. Tu descripción inicial fue un poco confusa. Estoy asumiendo que quiere borrar archivos de ese directorio hasta que haya 20 o menos:

@echo off 
set backupdir=c:\test 

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

Exactamente lo que dices, sin embargo hay un problema que entra en un bucle infinito, parece que los counfiches deberían disminuirse dentro del ciclo, como set/a "countfiles = countfiles-1" pero no parece funcionar para yo. – Hellnar

+0

@Hellnar, countfiles se establece de nuevo en el valor real en virtud del hecho de que la instrucción for que lo calcula está * dentro * del bucle. Lo hice de esa manera ya que no estaba claro cuántos archivos estaba eliminando su archivo VBScript. – paxdiablo

+0

Si tiene un bucle infinito, reemplace "@echo off" con ":: @ echo off" y vuelva a ejecutar el script. Eso generará los comandos mientras se ejecutan y verá en qué archivos de cuenta se está configurando. – paxdiablo

2

fue muy útil para mí que he utilizado de la siguiente manera para agregar usuario en 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 
1
@echo off 

set countfiles=10 

:loop 

set /a countfiles -= 1 

echo hi 

if %countfiles% GTR 0 goto loop 

pause 

en el primer "set countfiles" del 10 que se ve es la cantidad se hará en bucle la hi eco es lo desea bucle

... soy 5 años de retraso

-4

se puede hacer con un bucle do while ... enddo.

+0

Google sugiere que esta construcción se encuentra en lenguajes como FORTRAN/FoxPro? – mwfearnley

Cuestiones relacionadas