将文本文件中列出的多个文件从源子文件夹复制到新文件夹

问题描述 投票:0回答:1

我需要找到 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"

请帮忙搜索源子文件夹有什么问题。

windows batch-file copy
1个回答
0
投票

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

请注意,

|
不能出现在合法的文件名中。

© www.soinside.com 2019 - 2024. All rights reserved.