Скопировать список (txt) файлов - PullRequest
26 голосов
/ 07 июня 2011

Я видел несколько примеров сценариев для SO, но ни один из них, кажется, не дает примеров того, как читать имена файлов из списка .txt.

Этот пример хорош, так как копирует все файлы изПапка от А до Б

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\*.* эти *.* должен быть список файлов, прочитанных из текстового файла.

File-list.txt (пример)

file1.pds
filex.pbd
blah1.xls

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

Ответы [ 5 ]

38 голосов
/ 07 июня 2011

Учитывая ваш список имен файлов в файле с именем 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%"
)
20 голосов
/ 26 июня 2015

Я просто попытался использовать ответ Фрэнка Боллака и Воробья, но безуспешно, потому что он включал переключатель / 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%"
)
3 голосов
/ 13 декабря 2016

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

3 голосов
/ 07 июня 2011

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

@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%\"
)
0 голосов
/ 09 декабря 2016

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

@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"
)
...