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

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

file1.pds
filex.pbd
blah1.xls

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

6 ответов

Решение

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

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

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

@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%\"
)

Следующее скопирует файлы из списка и сохранит структуру каталогов. Полезно, когда вам нужно сжать файлы, которые были изменены в диапазоне коммитов Git/SVN, например. Он также будет работать с пробелами в именах каталогов / файлов и работать как с относительными, так и с абсолютными путями:

@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 как абсолютный путь, а также.

(на основе этого вопроса: как развернуть две локальные переменные внутри цикла for в пакетном файле)

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

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

Также можно использовать robocopy и Not use for loop with 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
Другие вопросы по тегам