您实际上做对了一切,但缺少细节。
这是一个有效的脚本,它可能有一些包含空格的路径的错误尚未测试):
@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:\batchdir 的文件 findmissing.cmd 中
(即批处理文件的完整路径是 c:\batchdir\findmissing.cmd)
- 要查找的文件列表在文件中列出:c:\batchdir\listimagescopy.txt
- 包含“未找到”文件列表的结果文件将是: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 的内容放在变量中而不是重复模式来使内部循环更好,但是您需要延迟扩展,请参阅here 和 here