我有一个批处理文件,可以根据文件列表递归我的文件夹,基本上可以创建两个报告。一个文件存在,一个文件不存在。 我现在要做的是查明目录中是否存在文件但文件列表中是否存在(即我是否有额外的文件)。
这是我当前的档案..
FOR /F "usebackqdelims=" %%f IN ("filelist.txt") DO (IF EXIST "%%f" (ECHO %%f exists >> "%~dp0\Exists.txt" ) ELSE (ECHO %%f doesn't exist >> "%~dp0\doesntexist.txt" ))
答案 0 :(得分:1)
标准的Windows控制台应用程序 FINDSTR 绝对是一个非常好的选择,因为它可以通过下面的代码看到。
@echo off
setlocal
set "ListFiles=%~dp0FileList.txt"
set "ListExist=%~dp0Exist.txt"
set "ListMissing=%~dp0NotExist.txt"
set "ListExtra=%~dp0Extra.txt"
set "ListCurrent=%TEMP%\ListCurrent.tmp"
rem Get list of all files in current directory and its subdirectories with
rem full path into a temporary list file. If the current directory tree
rem contains no file, delete empty list file and exit batch processing.
dir /A-D /B /ON /S >"%ListCurrent%" 2>nul
if errorlevel 1 (
copy "%ListFiles%" "%ListMissing%" >nul
if exist "%ListExist%" del "%ListExist%"
if exist "%ListExtra%" del "%ListExtra%"
goto EndBatch
)
%SystemRoot%\System32\findstr.exe /I /L /X /G:"%ListFiles%" "%ListCurrent%" >"%ListExist%"
%SystemRoot%\System32\findstr.exe /I /L /X /V /G:"%ListExist%" "%ListFiles%" >"%ListMissing%"
%SystemRoot%\System32\findstr.exe /I /L /X /V /G:"%ListExist%" "%ListCurrent%" >"%ListExtra%"
:EndBatch
del "%ListCurrent%"
endlocal
此批处理代码要求批处理文件目录中的FileList.txt
包含具有完整路径的文件名。
注意: %~dp0
扩展为已使用反斜杠结束的批处理文件的路径。因此,请不要在文件名之前指定额外的反斜杠。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
copy /?
del /?
dir /?
echo /?
endlocal /?
findstr /?
...了解过滤列表的工作方式非常重要。goto /?
if /?
rem /?
set /?
setlocal /?
有关>
,>nul
和2>nul
的说明,另请参阅有关Using command redirection operators的Microsoft文章。
答案 1 :(得分:0)
@echo off
setlocal
rem Load the list of filenames in *the subscripts* of an array
FOR /F "usebackq delims=" %%f IN ("filelist.txt") DO set "name["%%f"]=1"
rem Process files, remove elements of existent files from array
for %%f in (*.*) do (
IF defined name["%%f"] (
ECHO %%f exists >> "%~dp0Exists.txt"
set "name["%%f"]="
) ELSE (
ECHO %%f is extra >> "%~dp0ExtraFiles.txt"
)
)
rem Report remaining elements in the array
for /F "tokens=2 delims=[]" %%f in ('set name[') do (
ECHO %%~f doesn't exist >> "%~dp0doesntexist.txt"
)