复制一个文件列表(txt)

30

我在stackoverflow上看到了一些脚本示例,但是没有一个示例提供如何从.txt列表中读取文件名的示例。

这个例子很好,可以将所有文件从A文件夹复制到B文件夹

xcopy c:\olddir\*.java c:\newdir /D /E /Q /Y

但是我需要像下面这样的东西,我可以填写实际的源文件夹和目标文件夹:

 @echo off
 set src_folder = c:\whatever\*.*
 set dst_folder = c:\foo
 xcopy /S/E/U %src_folder% %dst_folder%

而不是 src_folder = c:\whatever\*.*,那些 *.* 需要是从一个文本文件中读取的文件列表。

文件列表.txt(示例)

file1.pds
filex.pbd
blah1.xls

有人能为我建议一下如何做吗?


6
在bash中,这将非常容易。该死的Windows和它的不合规定! - Blender
1
这是批处理编程的其中一项用途,所以在这里也非常容易。 - indiv
我该如何将扩展名添加到%%i?在filelist.txt中,我有文件名,但这些文件的扩展名是.pbd。 - BoDiE2003
6个回答

52

假设你有一个名为File-list.txt的文件,其中包含你要处理的文件名列表,下面的代码将实现你想要的功能:

@echo off
set src_folder=c:\whatever
set dst_folder=c:\target
for /f "tokens=*" %%i in (File-list.txt) DO (
    xcopy /S/E "%src_folder%\%%i" "%dst_folder%"
)

3
为了处理文件列表中文件名中的空格,请在FOR命令中使用选项"tokens=*" - PA.
它说它找不到文件,而且我不明白在哪里添加“tokens=*”。 - BoDiE2003
2
我在使用这个答案时遇到了文件找不到的问题。通过稍微修改,我解决了它:for /f "tokens=*" %%i in (File-list.txt) DO xcopy "%src_folder%%%i" "%dst_folder%" - Anthony
也许一个不错的补充是,当你想要复制的不是文件列表,而是文件夹及其内容列表时,可以使用以下代码:`@echo off set src_folder=d:\source
set dst_folder=d:\target
set dir_list=d:\copylist.txtif not exist "%dst_folder%" mkdir "%dst_folder%"for /f "delims=" %%f in (%dir_list%) do ( if not exist "%dst_folder%%%f" (mkdir "%dst_folder%%%f") xcopy "%src_folder%%%f*.*" "%dst_folder%%%f" )`
- Sander
如果我有一个包含文件位置的列表,例如“D:\pics\Lam In\IMG_7894.jpg”该怎么办? - RogUE
显示剩余3条评论

19

我刚刚尝试使用Frank Bollack和sparrowt的答案,但没有成功,因为它包括xcopy的/U开关。据我理解,/U的意思是仅当文件已经存在于目标位置时才会复制文件,但这对我来说并不是这种情况,也似乎不是原问题提出者的情况。可能是想要使用/V进行验证,这将更有意义。

移除/U开关修复了问题。

@echo off
set src_folder=c:\whatever
set dst_folder=c:\target
for /f "tokens=*" %%i in (File-list.txt) DO (
xcopy /S/E "%src_folder%\%%i" "%dst_folder%"
)

我遇到了复制JPG文件的同样情况。使用/U开关没有复制任何文件,但没有/U则复制成功。 - Evan

3
这将做到它:
@echo off
set src_folder=c:\batch
set dst_folder=c:\batch\destination
set file_list=c:\batch\file_list.txt

if not exist "%dst_folder%" mkdir "%dst_folder%"

for /f "delims=" %%f in (%file_list%) do (
    xcopy "%src_folder%\%%f" "%dst_folder%\"
)

1
一些注意事项:(1) if not exist 仅适用于文件; (2) 在此语法中 "usebackq" 是无用的,我宁愿包含 "tokens=*" 来处理文件名中的空格; (3) 使用 " 包围 XCOPY 的参数。 - PA.

2
以下内容将从列表中复制文件并保留目录结构。例如,当您需要压缩在一系列Git / SVN提交中已更改的文件时非常有用。它还可以处理目录/文件名称中的空格,并且适用于相对路径和绝对路径:
(基于此问题:如何在批处理文件中的for循环中扩展两个本地变量
@echo off

setlocal enabledelayedexpansion

set "source=input dir"
set "target=output dir"

for /f "tokens=* usebackq" %%A in ("file_list.txt") do (
    set "FILE=%%A"
    set "dest_file_full=%target%\!FILE:%source%=!"
    set "dest_file_filename=%%~nxA"
    call set "dest_file_dir=%%dest_file_full:!dest_file_filename!=%%"
    if not exist "!dest_file_dir!" (
        md "!dest_file_dir!"
    )
    set "source_file_full=%source%\!FILE:%source%=!"
    copy "!source_file_full!" "!dest_file_dir!"
)
pause

请注意,如果您的文件列表包含绝对路径,则必须将 source 也设置为绝对路径。
[¹] 如果使用 Git,请参见:如何在 Git 中仅导出已修改和已添加的文件并保留文件夹结构

1
这个解决方案比xcopy解决方案更好,因为它不会像得到最高票的答案那样创建大量空文件夹并将所有内容倾倒到目标文件夹中。 :| - Merlyn Morgan-Graham

1
这也将保留文件的原始文件目录:
@echo off
set src_folder=c:\whatever
set dst_folder=c:\target
set file_list=C:\file_list.txt

for /f "tokens=*" %%i in (%file_list%) DO (
   echo f | xcopy /E /C /R /Y "%src_folder%\%%i" "%dst_folder%\%%i"
)

0

还可以使用robocopy而不是使用带有xcopy的循环 - 可以在参数中解析文件列表。

robocopy Source_folder Destination_folder [files_to_copy] [options]

复制文件字符串以空格分隔。

robocopy . "d:\my folder" *.txt "my file one.cpp" file2.cpp
robocopy "d:\F 15" "d:\backup\F 15" /E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接