我有一个带有文件名列表的文本文件&我想搜索“如果不存在”&如果命令没有找到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?)
答案 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%
)
)
<强>用法强>
该命令从当前目录递归搜索文件。它接受两个参数:第一个是包含要搜索的文件列表的文件的完整路径,第二个是记录未找到文件的文件的完整路径。
例如,假设:
然后,为了搜索目录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
)