2

我有一个带有文件名列表的文本文件&我想搜索“如果不存在”&如果命令没有找到 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 ...我不确定

(我发现了一个类似的问题,但没有一个答案能满足我的需要——如何测试文件列表是否存在?

4

2 回答 2

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 的内容放在变量中而不是重复模式来使内部循环更好,但是您需要延迟扩展,请参见此处此处

于 2013-01-08T23:46:58.033 回答
0

这会将列表中未在任何子文件夹中找到的所有文件输出到文件中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
)
于 2013-01-09T09:40:54.370 回答