2009-11-24 127 views
31

這是我想要的,在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% 
) 
+1

那麼你的問題是什麼?這批是否工作,或者是你的問題,它是壞的? – schnaader 2009-11-24 07:43:45

回答

41
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 
37

while迴路可以在cmd.exe可以模擬與:

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

例如,下面的腳本:

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

輸出:

0 
1 
2 
3 
4 
5 

對於您的特定情況,我會從以下開始。你的初始描述有點令人困惑。我假設你想在某個目錄下刪除文件,直到有20個或更少:

@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

exaclty你在說什麼,但是它是一個進入無限循環的問題,似乎應該在循環內部減少counfiles,比如set/a「countfiles = countfiles-1」,但它似乎不適用於我。 – Hellnar 2009-11-24 08:15:42

+0

@Hellnar,憑藉計算它的for語句在循環內*的事實,countfiles再次被設置爲實值。我這樣做,因爲它不清楚您的VBScript文件有多少文件正在刪除。 – paxdiablo 2009-11-24 08:29:52

+0

如果您有無限循環,請將「@echo off」替換爲「:: @ echo off」並重新運行該腳本。這將在執行時輸出命令,您將看到正在設置的計數文件。 – paxdiablo 2009-11-24 08:31:18

2

這是非常有用的我,我以下列方式已經習慣了在Active Directory中添加用戶:

:: 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 

第一個「設置countfiles」你看10,將循環 回聲是喜是量要循環

的事...我5年晚

-4

它可以用do while ... enddo迴路來完成。

+0

谷歌建議這種構造可以在諸如FORTRAN/FoxPro等語言中找到? – mwfearnley 2017-12-23 16:15:21