Копирование списка (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-файла.
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"
)