Скопируйте список (txt) файлов

Я видел несколько примеров сценариев поверх SO, но ни один из них, похоже, не дает примеров того, как читать имена файлов из списка .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-файла.

Файл-list.txt (пример)

file1.pds
filex.pbd
blah1.xls

Может ли кто-нибудь предложить мне, как это сделать?


person BoDiE2003    schedule 06.06.2011    source источник
comment
В bash это было бы проще простого. Черт бы тебя побрал Windows и твое неумение подчиняться!   -  person Blender    schedule 07.06.2011
comment
Это одна из тех вещей, для которых было создано пакетное программирование, так что здесь тоже все проще простого.   -  person indiv    schedule 07.06.2011
comment
как я могу добавить расширение к %%i? в filelist.txt у меня есть имена файлов, но файлы имеют расширение .pbd   -  person BoDiE2003    schedule 07.06.2011


Ответы (5)


Учитывая ваш список имен файлов в файле с именем 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%"
)
person Frank Bollack    schedule 06.06.2011
comment
чтобы справиться с пробелами в именах файлов в списке файлов, используйте опцию "tokens=*" в команде FOR. - person PA.; 07.06.2011
comment
Пишет, что не может найти файлы, плюс я не понимаю куда добавлять токены=* - person BoDiE2003; 07.06.2011
comment
для /f tokens=* %%i в (File-list.txt) DO xcopy /S/E/U %src_folder%\%%i %dst_folder% - person Carel; 03.04.2013
comment
Я получал файл, не найденный с этим ответом. Получил работу с небольшой модификацией: for /f "tokens=*" %%i in (File-list.txt) DO xcopy "%src_folder%%%i" "%dst_folder%" - person Anthony; 12.03.2014
comment
Спасибо @Anthony. Я отредактировал ответ, чтобы решить эту проблему, удалив косую черту из папки src_folder (что эквивалентно тому, что вы сделали). - person sparrowt; 04.12.2014
comment
Возможно приятное дополнение, это когда вы хотите скопировать не список файлов, а список папок и их содержимое, это работает: @echo off set src_folder=d:\source\ set dst_folder=d:\target\ set dir_list=d:\copylist.txt if 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\" ) - person Sander; 18.11.2016
comment
Удалите /U! (Копирует только те файлы, которые уже существуют в месте назначения) вы имели в виду /V (Проверяет файлы...) - person The One; 31.01.2017
comment
Что делать, если у меня есть список, содержащий расположение файлов, например D:\pics\Lam In\IMG_7894.jpg? - person RogUE; 26.02.2017

Я только что попытался использовать ответ Фрэнка Боллака и воробья, но безуспешно, потому что он включал переключатель / U для xcopy. Насколько я понимаю, /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%"
)
person Scriptman    schedule 26.06.2015
comment
Я столкнулся с той же ситуацией, копируя файлы JPG. С параметром /U ничего не копировалось, но без /U копирование прошло успешно. - person Bird; 05.04.2017

Это сделает это:

@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%\"
)
person indiv    schedule 06.06.2011
comment
Некоторые предостережения (1)if not exist работают только с файлами; (2) "usebackq" в этом синтаксисе бесполезно, я бы предпочел включить "tokens=*", чтобы справиться с пробелами в именах файлов; и (3) используйте " вокруг параметров XCOPY - person PA.; 07.06.2011

Следующее скопирует файлы из списка и сохранит структуру каталогов. Полезно, например, когда вам нужно сжать файлы, которые были изменены в диапазоне коммитов 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

person Marc.2377    schedule 13.12.2016
comment
Работало намного лучше, чем решение xcopy для меня, поскольку оно не создавало тонну пустых папок и не выгружало все в целевую папку, как это сделал ответ, получивший наибольшее количество голосов: | - person Merlyn Morgan-Graham; 24.07.2018

Это также сохранит исходный каталог файлов файлов:

@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"
)
person Norlig    schedule 09.12.2016