Подтвердить что ты не робот

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

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

file1.pds
filex.pbd
blah1.xls

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

4b9b3361

Ответ 1

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

Ответ 2

Я просто попытался использовать Frank Bollack и sparrowt ответ, но безуспешно, потому что он включал переключатель /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

Это будет сделано:

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

Ответ 4

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

Ответ 5

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

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