【问题标题】:If statement for ForFiles based on file date基于文件日期的 ForFiles 语句
【发布时间】:2019-03-25 15:38:45
【问题描述】:

我有一个通过 SQL 服务器代理调用的批处理文件。

目前我有:

ForFiles /p "C:\folder\subfolder" /d -7 /c "cmd /c del @file"

如果有超过 7 天的文件,该命令可以正常工作。

如果没有符合条件的文件,则脚本失败导致 SQL 报告失败。

理想情况下,我需要添加 if 语句,如果存在超过 7 天的文件,则执行删除命令,否则忽略它。

有什么指导吗?

【问题讨论】:

  • 你没有在forfiles循环中尝试过if exist @file del @file吗?
  • @aschipfl FORFILES 命令将输出 ERROR: No files found with the specified search criteria. 如果根据使用的选项找不到任何文件。
  • 真的,@Squashman!所以forfiles ... 2> nul || exit /B 0 可以做到...

标签: windows batch-file command-line forfiles


【解决方案1】:

将其包装在 FOR /F 命令中,将标准错误重定向到 NUL。

FOR /F "delims=" %%G IN ('forfiles /P "C:\folder\subfolder" /d -7  2^>nul') do DEL "%%~G"

【讨论】:

  • 这将在for /F循环不迭代时将退出代码设置为1,这是由SQL工具检测到的...
  • @aschipfl 我在 cmd 行测试了它并检查了错误级别,它总是为零。
  • 是的,ErrorLevel0,但退出代码是 1,因为 for /F 是少数几个不会将两个值都设置为相同值的命令之一;我忘记了,对不起!将整个循环放在括号中并附加|| rem/,然后ErrorLevel也变成1...
  • @aschipfl 非常感谢。在这个星球上生活了 50 年后,我以为我对批处理文件几乎一无所知。
  • @aschipfl 我在问题下方的评论中尝试了您的代码选项,但我似乎无法使其工作。
【解决方案2】:

试试这个:

cd /d C:\folder\subfolder
SET _CmdResult=NONE
FOR /F "tokens=*" %%a IN ('forfiles -p "C:\folder\subfolder" -s -m *.* -d -7 -c "cmd /c del @file" 2^>^&1 ^| FINDSTR ERROR') DO SET _CmdResult=%%a
IF "%_CmdResult%" == "ERROR: No files found with the specified search criteria." ( 
    SET errorlevel=0 
 ) ELSE ( 
    SET errorlevel=1
 )
IF "%_CmdResult%" == "NONE" SET errorlevel=0

它会检查错误,并将错误放入一个变量中,如果找到,我们将错误级别设置为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2020-02-02
    • 1970-01-01
    相关资源
    最近更新 更多