【问题标题】:using the command line i would like to see if a list of files exist使用命令行我想查看是否存在文件列表
【发布时间】:2013-01-08 22:28:03
【问题描述】:

我有一个包含文件名列表的文本文件&我想搜索“如果不存在”&如果命令没有找到 listimagescopy.txt 文件中提到的任何文件,它应该创建一个新文件 notfound.txt这将列出所有未找到的文件

我开始试图弄清楚,但我不太好 w cmd- 对此影响的一些东西 - 粘贴到 .cmd 文件中

@echo off

FOR /F "tokens=*" %%a IN (listimagescopy.txt) DO (
 IF NOT EXIST "%%a" echo %%a Not found >notfound.txt
)

我不确定如何&在哪里指定它应该在哪个文件夹中搜索 - 还需要它在子文件夹中查找也许我需要使用嵌套 FORs w FOR /R ...我不确定

(我发现了一个类似的问题,但没有一个答案能满足我的需要-How can I test if a list of files exist?

【问题讨论】:

  • 你可能想要>> notfound.txt
  • @Eli 我想要任何工作
  • 你快到了,这是一个有趣的问题,给我一些时间 :)

标签: batch-file dos


【解决方案1】:

您实际上做对了一切,但缺少细节。 这是一个有效的脚本,它可能有一些包含空格的路径的错误尚未测试):

@echo off

SETLOCAL

SET fileList=%1
SET notFoundFile=%2

REM clear the not found file

type NUL > %notFoundFile%

FOR /R %%d IN (.) DO (
   FOR /F "tokens=*" %%a IN (%fileList%) DO (

      ECHO processing "%%~fd\%%a"
      IF NOT EXIST "%%~fd\%%a" ECHO %%~fd\%%a Not found >> %notFoundFile%
   )
)

用法

该命令从当前目录递归搜索文件。它接受两个参数:第一个是包含要搜索的文件列表的文件的完整路径,第二个是记录未找到文件的文件的完整路径。

例如,假设:

  1. 上面的批处理存储在目录 c:\batchdir 的文件 findmissing.cmd 中 (即批处理文件的完整路径是 c:\batchdir\findmissing.cmd)
  2. 要查找的文件列表在文件中列出:c:\batchdir\listimagescopy.txt
  3. 包含“未找到”文件列表的结果文件将是:c:\batchdir\notfound.txt

然后为了搜索目录 c:\searchdir 及其所有子目录中的文件,您需要 CD 到该目录并运行:

c:\searchdir> \batchdir\findmissing.cmd \batchdir\listimagescopy.txt \batchdir\notfound.txt

发生了什么

批处理文件将第一个参数(示例中为 \batchdir\listimagescopy.txt)存储在参数变量 %1 中,第二个参数(示例中为 \batchdir\notfound.txt)存储在 %2 中(如果它们存在将被存储 %3 %4 等)

SET fileList=%1
SET notFoundFile=%2

将命令行参数存储在本地(由于上面的 SETLOCAL)环境变量中。这只是为了方便使用更好的变量名。环境变量在批处理中被扩展(访问),例如%fileList%。

type NUL > %notFoundFile%

清除“未找到”文件的内容或创建一个新的零长度文件(如果不存在)。这很重要,因为我们将追加到这个文件中,并且不希望不同运行的结果出现在那里。

FOR /R %%d IN (.) DO (

从当前目录开始,并通过与 (.) 匹配来递归列出所有目录。 目录名放在for循环变量%%d

   FOR /F "tokens=*" %%a IN (%fileList%) DO (

按照您在问题中的描述进行操作,它获取 fileList 中的每一行并将其存储在 for 变量 %%a 中

现在有趣的部分 %%d 包含循环中的当前目录,包括结尾的“。”比如:

%%d = "c:\searchdir\."

使用 ~f 选项访问变量会删除结尾的 '.'

%%~fd = "c:\searchdir"

%%a 包含您正在搜索的文件之一的名称:

%%a = "image001.jpg"

然后:

%%~fd\%%a = "c:\searchdir\image001.jpg"

这些行现在应该很明显了:

      ECHO processing "%%~fd\%%a"
      IF NOT EXIST "%%~fd\%%a" ECHO %%~fd\%%a Not found >> %notFoundFile%

但无论如何我都会解释它们;第一个只是告诉你批次在做什么。可以删除它以加快速度(相当大。) 第二个测试文件 %%~fd\%%a 是否存在,如果不存在,则将字符串“%%~fd\%%a Not found”附加到文件 %notFoundFile%(即 >>,使用 > 覆盖),扩展变量后,您将获得文件中未找到的文件的实际名称。

您可以通过将 %%~fd\%%a 的内容放在变量中而不是重复模式来使内部循环更好,但是您需要延迟扩展,请参阅herehere

【讨论】:

  • @June 我已经扩展了我的答案以包含更多细节。我希望这会有所帮助。
  • 非常感谢,我稍后会检查它是否有效,我一定会告诉你
  • 非常感谢您的详细解释,我一直希望了解更多信息,这肯定会有所帮助
【解决方案2】:

这会将列表中在任何子文件夹中找不到的所有文件输出到文件notfound.txt

setlocal enabledelayedexpansion
pushd "N:\opasdata\d110001\medias\images"
set found=false
for /f "tokens=* delims=" %%a in (listimagescopy.txt) do (
for /r %%x in (%%a) do (
if exist "%%a" set found=true
)
if "!found!"=="false" echo %%a >>"V:\Current Library\notfound.txt"
set found=false
)

【讨论】:

  • 我已经用你的设置编辑了我的答案。您可能想要更改的唯一内容是带有名称列表的文件,我根据您的示例使用了listimagescopy.txt,但如果您愿意,只需更改它即可。
猜你喜欢
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多