我需要找到 500 个图像文件,其中的名称已在文本文件中列出(每行一个文件名)。搜索将在外部硬盘的所有子文件夹中完成,所有文件将复制到本地驱动器。
pushd D:\move_script
for /f "tokens=* delims=" %%a in ('type List.txt') do xcopy /hrkvy ".\SourceFolder\%%a" ".\DestinationFolder"
popd
SourceFolder 中未找到文件。目录 D:\move_script 中有多个子文件夹 那么我如何提到源文件夹,以便它可以搜索 D:\move_script 下所有子文件夹中的文件。
当我使用单个源文件夹(如下面的命令所示)时,其搜索的文件仅在数据文件夹下并复制到目标文件夹。
for /f "tokens=* delims=" %%a in ('type List.txt') do xcopy /hrkvy ".\**data**\%%a" ".\DestinationFolder"
请帮忙搜索源子文件夹有什么问题。
AIUI,问题是将
list.txt
文件中命名的文件从源子树中存在的任何位置复制到目标目录。
您的代码存在问题:您使用了
pushd/popd
括号,这意味着在 pushd
和 popd
之间,当前目录是(PUSHD
的参数)
术语
.
中的".\SourceFolder\%%a"
表示目录相对于当前目录 - 当前目录是D:\move_script
,因此xcopy
解释的源是"D:\move_script\SourceFolder\%%a"
解决此问题的简单方法是删除
pushd/popd
命令,然后执行 D:\move_script\thisbatchname
这将执行相对于执行时选择的目录的剩余命令。
方法有问题。鉴于
xcopy
可以修复为执行源子树中与 %%a
中的名称匹配的一个文件的复制,则该搜索需要执行 500 次 - list.txt
中的每个条目一次,其中会非常。 .s.l.o.w.
所以这是另一种方法:
@ECHO OFF
SETLOCAL
rem The following settings for the directory and filename are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q78088112.txt"
(
FOR /f "delims=" %%e IN ('XCOPY /L /Y /S "%sourcedir%\*"') DO ECHO %%e^|%%~nxe
)>"%temp%\####.exist"
(
FOR /f "usebackqdelims=" %%e IN ("%filename1%") DO ECHO ^|%%e
)>"%temp%\####.incl"
FOR /f "tokens=1delims=|" %%e IN ('findstr /e /L /g:"%temp%\####.incl" "%temp%\####.exist"') DO ECHO COPY "%%e" "destdirname"
DEL "%temp%\####.excl" "%temp%\####.exist"
GOTO :eof
请注意,如果文件名不包含空格等分隔符,则
usebackq
和 %filename1%
周围的引号都可以省略。
所需的 COPY 命令仅出于测试目的而进行
ECHO
编辑。 确认命令正确后,将 ECHO COPY
更改为 COPY
以实际复制文件。附加 >nul
以抑制报告消息(例如 1 file copied
)
首先,执行
xcopy
列表,在临时文件 ####.exist
中创建完整的文件列表,每行格式为 fullfilename|filenameandextension
接下来,将文件名列表处理为
####.incl
,只需在每个文件名前插入一个|
然后使用
####.exist
作为分隔符(成为要复制的文件的完整文件名)查找 |
中各行的第一个标记,其中 /e
行以 /g:
文件中的任何条目结尾, ####.incl
请注意,
|
不能出现在合法的文件名中。