Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] батник для копирования файлов из ряда поддиректорий (http://forum.oszone.net/showthread.php?t=174234)

xumuk032 27-04-2010 14:37 1401800

батник для копирования файлов из ряда поддиректорий
 
Проблема следующая. Есть директория с n-ным количеством поддиректорий. Во всех этих поддиректориях нужно найти некоторые файлы и скопировать в единую дирректорию. Имена файлов задаются списком baselist.
Хотелось бы с применением нижеописанной конструкции
Код:

for %%a in (%Baselist%) do copy /b "%dir1%%%a*.ans" "%dir2%"
Или проще будет задать список папок, из которых копировать все файлы? Но так не совсем удобно(((

NiOl 27-04-2010 19:18 1401998

Будет вот так (насколько я понял):
- в переменную List - имя файла (и путь к нему при необходимости) со списком копируемых файлов
- в переменную Dst - каталог, куда копировать файлы (на конце знак "\").
- копируется из текущего каталога (откуда произведен запуск) с подкаталогами.

Код:

@echo off
SetLocal EnableExtensions

Set List=baselist.txt
Set Dst=C:\TEMP\

if not exist %List% (
echo List-file not found!
exit 1
)
Set log="%~dpn0.log"
Set tmp="%~dpn0.tmp"
Set wrk="%~dpn0.lst"

echo ======= %date% %time:~0,8% =======>>%log%
del /f %wrk% 2>nul
dir /a /b /on /s>%tmp%
for /f "usebackq tokens=* delims=" %%F in ("%List%") do findstr /c:"%%F" %tmp%>>%wrk%
for /f "usebackq tokens=* delims=" %%F in (%wrk%) do (
copy /b /y "%%F" "%Dst%" >nul 2>nul
if errorlevel 1 (echo  Can`t copy %%F to "%Dst%">>%log%) else (echo  File %%F copied>>%log%)
)

del /f %tmp%
del /f %wrk%

ЗЫ: Одноименные файлы при копировании перезатираются новыми и в логе это не отражается (такая проверка потребует некоторого усложнения алгоритма).

megaloman 27-04-2010 19:37 1402009

А так вот нельзя?
Код:

Set Baselist="kuku.txt","kuku1.txt"
Set Otkuda="H:\Delete"
Set Kuda="H:\Delete1\"

for /R %Otkuda% %%i in (%Baselist%) do copy "%%~fi" %Kuda%

Здесь переменной Otkuda присвоено имя директории в которой могут быть поддиректории разной вложенности, из которых берутся файлы, помянутые в списке. За просмотр поддиректорий отвечает ключ /R.
%%~fi расширяет имя файла в переменной %%i до полного имени (с путём).
Кавычки надо на случай того, что в имени файла или пути могут встретиться пробелы

xumuk032 27-04-2010 21:23 1402062

Спасибо, megaloman, идею подхватил, под себя доработал. Вариант отличный!


Время: 22:51.

Время: 22:51.
© OSzone.net 2001-