【问题标题】:DOS batch - Print names of files (exclude certain extensions)DOS 批处理 - 打印文件名(不包括某些扩展名)
【发布时间】:2012-06-12 00:26:42
【问题描述】:

问题是关于实际的 DOS 批处理文件,而不是 Windows cmd.exe 脚本文件。

如何在for 循环中排除具有特定扩展名的文件?

@echo off

set myExtension=

for /r C:\ %%i in (*) do (
    ::notDesirableExtension
    if myExtension != gif or jpg
        ...
    echo myFiles >> F:\list.txt
) 

【问题讨论】:

  • 您的问题是关于实际的 DOS (command.com) 批处理文件,还是关于 Windows 命令处理器 (cmd.exe) 脚本文件?语法和功能方面存在重大差异,并且差异很重要。 (您的问题标题同时显示WindowsDOS。)
  • 我的问题是关于 DOS (command.com) 批处理文件。
  • 我进行了编辑以表明这一点,并更清楚地提出问题。仅供参考,我认为在 DOS 下对于 cmets 不支持 ::; IIRC,当时只有REM。此外,this question 可能会有所帮助;这是关于删除除具有特定扩展名之外的所有内容,但想法是一样的。
  • 感谢肯,但上面的链接没有帮助。我正在尝试将循环中的 myExtension 变量设置为扩展字符串,然后打印文件名减去不需要的扩展名。
  • 实际上,它应该(我写了接受的答案,并且知道它的作用)。它在哪些方面没有帮助?您可以在执行echo 之前使用多个attrib 命令,并且您还没有指出myFiles 应该包含什么。我不清楚你想在这里做什么。 (循环不是必需的。隐藏不需要的扩展名,执行dir > F:\list.txt,然后重置属性以取消隐藏文件。)

标签: loops filenames dos


【解决方案1】:

由于您可以访问 FOR /R,这意味着您可以访问命令扩展。所以答案很简单。

@echo off
for /r C:\ %%i in (*) do (
  if "%%~xi" neq ".jpg" if "%%~xi" neq ".gif" >>F:\list.txt echo %%i
)

但是根本没有理由使用 FOR 循环,因为您还应该可以访问 FINDSTR。这个 FINDSTR 解决方案应该快得多。并且不需要批处理文件。它在命令行上运行良好。

dir /s /b /a-d-h-s | findstr /live ".jpg .gif" >F:\list.txt

直到 Windows 2000 才引入命令扩展,这不是真正的 DOS。

【讨论】:

  • 看起来你应该使用 \ 符号转义搜索条件中的点,例如 findstr /live "\.jpg \.gif" ,否则它将查找类似的文件,例如 "asa_jpgd.doc" ,顺便说一句 - /live 开关是什么意思?
  • @qwebek - /LIVE/L /I /V /E 的缩写,即“文字”、“忽略大小写”、“inVerse”、“匹配行尾”。由于是字面搜索,而不是正则表达式,而且必须匹配行尾,所以点不需要转义,只会匹配正确的扩展名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2010-11-04
  • 1970-01-01
  • 2014-08-13
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多