您实际上做对了一切,但缺少细节。这是一个有效的脚本,它可能有一些包含空格的路径的错误尚未测试):
@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 的内容放在变量中而不是重复模式来使内部循环更好,但是您需要延迟扩展,请参见此处和此处