首先,您需要启用扩展命令行
SETLOCAL ENABLEEXTENSIONS
因此您可以使用扩展的 FOR 循环。二、需要开启环境变量的延迟扩展
SETLOCAL ENABLEDELAYEDEXPANSION
这样您就可以检查是否稍后找到搜索的文件。
结果如下:
@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
SET src=.\sourcefolder\
SET dst=.\destinationfolder\
SET file_list=.\files.txt
FOR /F %%f IN (%file_list%) DO (
SET found=false
FOR /F "usebackq" %%s IN (`where /R %src% %%f`) DO (
SET found=true
echo "%%s => %dst%\%%f"
@copy /y "%%s" "%dst%\%%f"
)
IF "!found!" == "false" (
echo %%f is not found!
)
)
ENABLEDELAYEDEXPANSION 在这里需要变量%found%,没有它%found% 将永远是false。
此外,要在运行时扩展环境,您必须使用!found! 语法。
你可以这样称呼它
batch.bat > result.log
结果将写入文件result.log
更新:这是不带变量 found 的 bacth 版本,并带有 @aschipfl 的建议:
@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET "src=.\sourcefolder\"
SET "dst=.\destinationfolder\"
SET "file_list=.\files.txt"
FOR /F "usebackq eol=| delims=" %%f IN ("%file_list%") DO (
rem just searching to find out existense of file
WHERE /Q /R "%src%" "%%f"
IF "!ERRORLEVEL!" == "0" (
FOR /F "usebackq eol=| delims=" %%s IN (`WHERE /R "%src%" "%%f" 2^> nul`) DO (
echo "%%s => %dst%\%%f"
@copy /y "%%s" "%dst%\%%f"
)
) ELSE (
echo %%f is not found!
)
)
此版本可以处理文件名中带有space 符号的文件。
但两种解决方案都有相同的限制:sourcefolder 的名称中不能包含任何空格。出于某种原因,命令 WHERE /R "%src%" "%%f" 不起作用,而 WHERE /R %src% "%%f" 则按预期工作。
UPDATE2:这是产生result.log的版本:
@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET "src=.\sourcefolder\"
SET "dst=.\destinationfolder\"
SET "file_list=.\files.txt"
SET "out=.\result.log"
echo > %out%
FOR /F "usebackq eol=| delims=" %%f IN ("%file_list%") DO (
rem just searching to find out existense of file
WHERE /Q /R %src% "%%f"
IF "!ERRORLEVEL!" == "0" (
FOR /F "usebackq eol=| delims=" %%s IN (`WHERE /R %src% "%%f"`) DO (
echo "%%s => %dst%\%%f" >> %out%
@copy /y "%%s" "%dst%\%%f"
)
) ELSE (
echo %%f is not found! >> %out%
)
)