首页 > 解决方案 > 批量比较文件的年份和大小时出现问题

问题描述

我对在 for 循环中进行比较(if 语句)表示怀疑:我在一个文件夹中有很多文件,我想进行两个比较:

  1. 如果文件是在当年创建的 (!dateFile:~6,4!equ %date:~6,4%)
  2. 如果文件大小为0字节(%%~Za equ 0)

当我找到符合这些条件的文件时,我想显示“ok”。

我有下一行代码,但它不起作用:

    for /f "tokens=* delims= " %%a in ('dir /s/b/a-d "FOLDER\"') do set dateFile=%%~ta if ((!dateFile:~6,4! equ %date:~6,4%) & (%%~Za equ 0)) echo "ok"

一些帮助?谢谢 :)

标签: windowsif-statementbatch-filecmd

解决方案


代码有几个问题:

首先:您的set命令向变量添加的内容比您想要的要多。
使用首选语法set "var=value"来避免这种情况。

第二:要连接命令,请使用&(在您的代码中缺少setand if

第三:您的if语法已关闭。if (a equ a) & (b equ b) ...不起作用。
你想要if a equ a if b equ b ...

第四:另一个(意外)问题:由于延迟扩展发生时,逗号!var:6,4!不安全并杀死if语法。引用比较的两边以避免这种情况(强制进行字符串比较,但逗号和其他“毒字符”在引号内是安全的)。

总而言之,以下内容应该适合您:

for /f "tokens=* delims= " %%a in ('dir /s/b/a-d ') do set "dateFile=%%~ta" & if "!dateFile:~6,4!" equ "!date:~6,4!" if %%~Za equ 0 echo "ok"

虽然我不喜欢“单线”解决方案——它们往往难以阅读,甚至更难维护,所以我建议使用:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims= " %%a in ('dir /s/b/a-d ') do (
  set "dateFile=%%~ta"
  if "!dateFile:~6,4!" equ "!date:~6,4!" if %%~Za equ 0 echo "ok"
)

推荐阅读