首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FOR循环中的FORFILES问题

FOR循环中的FORFILES问题
EN

Stack Overflow用户
提问于 2014-08-19 01:54:46
回答 1查看 321关注 0票数 0

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

代码语言:javascript
复制
::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不会填充,%%我不会填充,我不确定我做错了什么。帮助?

EN

回答 1

Stack Overflow用户

发布于 2014-12-27 18:18:53

你犯了几个非常小的错误。在DEL_FOLDERS中,您使用了%%1,这意味着参数没有展开(这里只需要1%)。您还没有处理没有匹配的文件或目录为空的情况。在FORFILES命令中放入/m *.*;尽管文档说这是默认设置,但文档并不正确。缺少/m会匹配所有文件(默认设置),但如果说/m *.*,则只能匹配带点的文件!

我更正的版本是:

代码语言:javascript
复制
::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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25369274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档