FOR循环问题中的FORFILES

时间:2014-08-18 17:54:46

标签: batch-file

我正在尝试制作一个脚本来删除空文件夹并删除几天之前的文件。取决于txt文件分隔符的设置。到目前为止我想出了这个:

::Batch
SET CDID=%~dp0
SET TEST=TRUE

IF %TEST%==TRUE (
    SET COMND1=ECHO
    SET COMND2=ECHO
    ) ELSE (
    SET COMND1=DEL
    SET COMND2=RD
    )
ECHO FILE RAN %date:~10%/%date:~4,2%/%date:~7,2% >>%CDID%\LOG.TXT 
FOR /F "usebackq delims=| tokens=1,2" %%x IN (%CDID%PATH.txt) DO (
    CALL :DEL_FOLDERS "%%x" %%y
    CALL :DEL_FILES "%%x" %%y
    )

GOTO :EOF

:DEL_FILES
    FORFILES /p %1 /s /m *.* /d %2 /c "cmd /c %COMND1% @file"
    GOTO :EOF

:DEL_FOLDERS
    FOR /f "delims=" %%i in ('dir %%1 /s /b /ad ^| sort /r') do %COMND2% "%%i" 
    GOTO :EOF


::PATH.txt
C:\Temp\BLANK|10
C:\Temp\New folder|30

当我运行脚本@file将不会填充和%%我将不会填充,我不知道我做错了什么。帮助

1 个答案:

答案 0 :(得分:0)

你做了几个非常小的错误。在DEL_FOLDERS中,您使用了%%1,这意味着参数未展开(您只需要一个%)。您也没有处理没有匹配文件或目录为空的情况。在FORFILES命令中,您放置了/m *.*;虽然文档说这是默认值,但文档不正确。错过/m匹配所有文件(默认值),但是说/m *.*只匹配带点的文件!

我的更正版本是:

::Batch
SET CDID=%~dp0
SET TEST=TRUE

IF %TEST%==TRUE (
    SET COMND1=ECHO
    SET COMND2=ECHO
    ) ELSE (
    SET COMND1=DEL
    SET COMND2=RD
    )
ECHO FILE RAN %date:~10%/%date:~4,2%/%date:~7,2% >>%CDID%\LOG.TXT 
FOR /F "usebackq delims=| tokens=1,2" %%x IN (%CDID%PATH.txt) DO (
    CALL :DEL_FOLDERS "%%x" %%y
    CALL :DEL_FILES "%%x" %%y
    )

GOTO :EOF

:DEL_FILES
    FORFILES /p %1 /s /d %2 /c "cmd /c %COMND1% @file" 2> nul
    GOTO :EOF

:DEL_FOLDERS
    FOR /f "delims=" %%i in ('dir "%~1" /s /b /ad 2^>nul ^| sort /r') do %COMND2% "%%i"
    GOTO :EOF


::PATH.txt
C:\Temp\BLANK|10
C:\Temp\New folder|30