【问题标题】:Problems while comparing years and sizes of file in batch批量比较文件的年份和大小时出现问题
【发布时间】:2021-03-12 05:15:41
【问题描述】:

我怀疑在 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"

一些帮助?谢谢:)

【问题讨论】:

  • ... do set "dateFile=%%~ta" & if ... - (假设您启用了延迟扩展。)
  • @Stephan 是的,我的代码开头有“setLocal EnableDelayedExpansion”,并且随着该更改继续失败:(
  • if (a equ a) & (b equ b) ... 不起作用。你想要if a equ a if b equ b ...
  • 类似的东西? for /f "tokens=* delims= " %%a in ('dir /s/b/a-d "FOLDER\"') do set dateFile=%%~ta & if !dateFile:~6,4! equ %date:~6,4% & if %%~Za equ 0 echo "ok"
  • 没有。和以前一样的问题。再读一遍我之前的两个cmets。

标签: windows if-statement batch-file cmd


【解决方案1】:

代码有几个问题:

首先:您的 set 命令向变量添加的内容超出了您的预期。
使用首选语法set "var=value" 来避免这种情况。

第二:连接命令,使用&(在setif之间的代码中缺少)

第三:您的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"
)

【讨论】:

  • 哦,谢谢斯蒂芬,我不知道在!var:~6,4! 中使用“”。
  • 别介意。我掉进了同一个陷阱(因此(unexpected) issue:)
猜你喜欢
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多