Копирование списка (txt) файлов

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

этот пример хорош, чтобы скопировать все файлы из папки 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-файла.

.формат txt (пример)
file1.pds
filex.pbd
blah1.xls

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

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

Я просто попытался использовать ответ Фрэнка Боллака и спарроута, но безуспешно, потому что он включал переключатель a /U для xcopy. Я понимаю, что /U означает, что файлы будут скопированы только в том случае, если они уже существуют в месте назначения, что не было для меня и, похоже, не относится к исходному вопрошающему. Возможно, это означало бы a / 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"
)