Скопируйте список (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