使用命令行我想看看是否存在文件列表

时间:2013-01-08 22:28:03

标签: batch-file dos

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

我开始尝试解决这个问题,但是我不太喜欢这种影响 - 粘贴到.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?

2 个答案:

答案 0 :(得分:1)

你确实把一切都搞定了,但缺少细节。 这是一个有效的脚本,可能有一些包含空格的路径的bug还没有测试过它们:)

@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
  4. 然后,为了搜索目录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是否存在,如果没有附加(使用&gt;&gt;,使用&gt;覆盖)字符串“%% ~fd \ %% a a Not found”到文件% notFoundFile%,在扩展变量后,您将获得文件中找不到的文件的实际名称。

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

答案 1 :(得分: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
)