Показать полную графическую версию : Скопировать файлы из папок по определенному названию
Здравствуйте!
Можете подсказать, как реализовать следующее:
Есть папка С:\Nodes, в ней одна или несколько папок такого формата - RU.*.*
Нужно пройтись по каждой такой папке и внутри из папки Config скопировать файлы config.xml.
И разложить эти файлы так: на С:\backup, здесь для каждого файла создавать папку с тем же названием RU.*.* (то есть название папки такое же, как то откуда мы его взяли).
Надеюсь, всё понятно написано)
Заранее благодарю за помощь.
xcopy /yes "С:\Nodes" "С:\backup"
Если именно...
@echo off
for /f "delims=" %%a in ('dir /ad/b/s "С:\Nodes\RU.*.*"') do xcopy /yes "%%a" "С:\backup\%%~nxa\"
exit
megaloman
15-10-2016, 08:53
@Echo Off
Set "InMask=C:\Nodes\Ru.*.*"
Set "InFile=Config\Config.xml"
Set "OutDir=C:\Backup"
FOR /F "usebackq delims=" %%d IN (`Dir "%InMask%" /A:D /B /S 2^>nul`) DO (
If Exist "%%d\%InFile%" (
Md "%OutDir%\%%~nxd" 2>nul
Copy "%%d\%InFile%" "%OutDir%\%%~nxd\" >nul
)
)
alpap, ошибка: Синтаксическая ошибка в имени файла, имени папки или метке тома.
megaloman, спасибо, всё работает. А не могли бы Вы пояснить, какой параметр за что отвечает, я новичок в этом деле.
Просто мне еще нужно по аналогии запрограммировать обратную операцию - восстановление. Хотелось бы разобраться.
Кроме этого нарисовались еще условия: для каждого запуска скрипта записывать всё в отдельный лог-файл.
И еще: при каждом запуске скрипта на С:\backup будет создаваться папка с названием - текущая дата и время, а в нее уже будут писаться папки Ru.*.* . С этим разобралась.
Соответственно при восстановлении (другой скрипт) пользователю должен вывестись список всех таких папок, пользователь должен выбрать ту, которая ему нужна, и далее уже восстановление файлов Config.xml
Жду посильной помощи)
Спасибо!
megaloman
18-10-2016, 13:36
JKop, Пользователь входит в систему под своим уникальным именем? Мне не нравится идея выбора пользователем имени папки при восстановлении.
megaloman, нет, не под уникальным. А чем не нравится?
megaloman
18-10-2016, 15:43
JKop, Я не очень представляю как сделать красиво и надёжно выбор. И выбор пользователем - это всегда путь к конфликту из-за возможного неверного выбора. Да еще Вы хотите иметь файлы за разные даты и время. Вот решение с организацией папок по дате-времени и ведением лог-файла.@Echo Off
Set "InMask=C:\Nodes\Ru.*.*"
Set "InFile=Config\Config.xml"
Set "OutDir=C:\Backup"
Set "Log=%~dpnx0.log"
Set "OutDir=%OutDir%\%Date%_%Time::=-%"
FOR /F "usebackq delims=" %%d IN (`Dir "%InMask%" /A:D /B /S 2^>nul`) DO (
If Exist "%%d\%InFile%" (
Md "%OutDir%\%%~nxd" 2>nul
Copy "%%d\%InFile%" "%OutDir%\%%~nxd\" >nul && Echo "%%d\%InFile%" ---^> "%OutDir%\%%~nxd\" >>"%Log%"
)
)
Что конкретно не понятно?
megaloman, не пойму, запускаю скрипт, ничего не происходит. Почему в коде появился диск Z: - поменяла на С:
megaloman
18-10-2016, 18:38
JKop, Виноват! У меня для отладки существует диск Z: , а Вам надо C:. Я в спешке выпустил это из виду. Плюс еще допустил погрешности. Я исправил скрипт, возьмите именно его, испытайте.
megaloman, да, то что нужно, спасибо! А над скриптом для восстановления сижу целый день.
Хотелось, чтобы при запуске скрипта пользователю вывелся список всех папок с бэкапами, типа:
1. 19.10.2016
2. 20.10.2016
и т.д.
Это сделала. Только с кодировкой проблемы - вместо русских букв символы, на этом пока не зацикливалась, пытаюсь сделать само восстановление.
Пользователь должен ввести число, например, 2, после чего будут восстановлены файлы из папки 20.10.2016. Восстановлены туда же, откуда мы их брали, то есть на С:\Nodes по папкам Ru.*.*
Вот как пытаюсь преобразовать код в обратную операцию, но пока безуспешно. Не пойму, как указать момент куда копировать - по папкам Ru.*.* (в коде поставила ??????????????????????)
@Echo Off
SETLOCAL EnableDelayedExpansion
Set "Log=%~dpnx0.log"
set num=1
echo доступные бекапы
for /f delims^=^"^ tokens^=1 %%i in ('forfiles /p "c:\backup" /c "cmd /c if @isdir==TRUE echo @file"') do (
echo !num!. %%i
set /a num+=1
)
set /P var=Введите номер бекапа:
set num1=1
for /f delims^=^"^ tokens^=1 %%i in ('forfiles /p "c:\backup" /c "cmd /c if @isdir==TRUE echo @file"') do (
if !num1! equ %var% (
set backupfolder=%%i
goto rec
)
set /a num1+=1
)
echo Резервная копия не найдена. Работа скрипта прекращена. >>"%Log%"
goto end
:rec
echo Будет использована резервная копия %backupfolder% >>"%Log%"
Set "InMask=C:\backup\%backupfolder%\"
Set "InFile=Ru.*.*\Config.xml"
Set "OutDir=C:\Nodes"
FOR /F "usebackq delims=" %%d IN (`Dir "%InMask%" /A:D /B /S 2^>nul`) DO (
If Exist "%%d\%InFile%" (
Copy "%%d\%InFile%" "%OutDir%\????????????????????????\Config\" >nul && Echo "%%d\%InFile%" ---^> "%OutDir%\????????????????????????\Config\" >>"%Log%"
)
)
:end
megaloman
21-10-2016, 17:32
Я не читатель, я писатель :), поэтому в Вашем коде не сильно копался. Как я понял, Вы выбираете бэкап за определённую дату-время и восстанавливаете все конфиги, которые там есть. @Echo Off
cls
Set "InMask=C:\Nodes\Ru.*.*"
Set "InFile=Config"
Set "OutDir=C:\Backup"
SetLocal EnableExtensions EnableDelayedExpansion
Set "DirFrom="
FOR /F "usebackq delims=" %%d IN (`Dir "%OutDir%" /A:D /B /O:-D /T:C 2^>nul`) DO (
Set "Sele="
Set /P "Sele=Доступна копия %%d. Восстанавливаем (Y), Далее (?), Закончить (Enter) "
If /I "!Sele!"=="Y" Set "DirFrom=%%d" &GoTo :Continue
If /I Not "!Sele!"=="?" GoTo :Eof
)
:Continue
If "%DirFrom%"=="" (
Echo Папка с восстанавливаемыми копиями не выбрана
Pause
GoTo :Eof
)
Set "Log=%~dpnx0.log"
Set "OutDir=%OutDir%\%DirFrom%"
FOR /F "usebackq delims=" %%d IN (`Dir "%InMask%" /A:D /B /S 2^>nul`) DO (
If Exist "%%d\%InFile%" If Exist "%OutDir%\%%~nxd\" (
Echo "%OutDir%\%%~nxd\*.*" ---^> "%%d\%InFile%\"
Copy "%OutDir%\%%~nxd\*.*" "%%d\%InFile%\" >nul && Echo "%OutDir%\%%~nxd\*.*" ---^> "%%d\%InFile%\" >>"%Log%"
)
)
Я не пошел по пути нумерации бэкапов - а что, если их список на экран не поместится, как выбирать? Я предоставляю возможность выбрать конкретный бэкап начиная с самого свежего.
Чтобы не было зюкочек в диалогах и сообщениях - сохраните батник в 866 кодировке.
Повторюсь, мне всё это не нравится, при нескольких пользователях такие неконтролируемые возможности приведут к конфликтам.
megaloman,
Не могли бы и мне помочь создать батник для запуска копирования(когда нужно-дамы запустят).
Нужно копировать измененные файлы из папки C:\Dvo\Bu в домашней сети на \\USB\Dvo\Bu (написал USB так как не помню название съемного носителя)это для одного компьютера
и для другого из
C:\Dvo\St в \\USB\Dvo\St
megaloman
21-10-2016, 23:25
\\USB\Dvo\Bu \\USB\Dvo\St Так обозначаются не съёмные носители, а сетевой путь на компьютер c именем USB на папку с общим доступом Dvo и подпапки в этой папке Bu и St. Что Вы имеете ввиду? Что Вы понимаете под названием съемного носителя?
Если это и в самом деле сетевые пути, то батник из одной строки:
xcopy "С:\Dvo\Bu\*.*" "\\USB\Dvo\Bu\" /E /D /Y Аналогично и для St
А еще лучше без батника: создать значок на xcopy и добавить туда параметры.
megaloman,
Это я со своего взял-у меня в сети есть ресивер \\VUDUO2\Harddisk
А у них к одному подключен жесткий диск через USB и второй компьютер его видит через сеть.
Я в понедельник посмотрю точный путь
megaloman, спасибо, всё работает)
Тоже взялась за копирование файлов на другой сервер в домене.
Делаю по вашему примеру:
xcopy "С:\Dvo\Bu\*.*" "\\USB\Dvo\Bu\" /E /D /Y »
xcopy "С:\test3\*.*" "\\10.52.10.175\Test\" /E
Но папка с файлами не копируется, "Неправильно указан диск".
Что может быть не так? Папка Test в общем доступе.
megaloman
25-10-2016, 20:08
JKop, У меня подобная конструкция прекрасно работает. ИМХО, папки по указанному пути нет. Я получил такое сообщение, когда сослался на несуществующую папку. Сделайте
Dir "\\10.52.10.175\Test\" - скорее всего получите "Неправильное сетевое имя"
Пытаюсь телепатировать:
Ваша папка Test - не имя сетевого ресурса, а папка внутри сетевого ресурса, например:
"\\10.52.10.175\Share\Test\"
Проверьте доступность сервера
ping 10.52.10.175
Если есть файл-менеджер типа Far или Total Commander, посмотрите, видна ли папка Test при просмотре сети.
Попробуйте выполнить локально на компе 10.52.10.175 команду
net share
Будет ли там помянута папка Test ?
Возможно, файервол сервера блокирует доступ на папку.
В общем, больше идей нет.
megaloman,
Затянулось у меня аж до пятницы.
Вот исходные данные
На первом компьютере нужно копировать все измененные и новые файлы и папки
с C:\dvo32 в E:\Lohnverrechnungs PC\Dvo32
и
с C:\EURONORM в E:\Lohnverrechnungs PC\EURONORM
На втором компьютере
с C:\dvo32 в \\LOHN\Sicherung\Buchhaltung PC\Dvo32
и
с C:\EURONORM в \\LOHN\Sicherung\Buchhaltung PC\EURONORM
megaloman
28-10-2016, 20:54
Ах, мой батюшка! Да извозчики-то на что ж? Это их дело. Это-таки и наука-то не дворянская. Дворянин только скажи: повези меня туда, свезут, куда изволишь.tyt, Все проблемы - в нежелании почитать описание команды xcopy /?. Там всё написано.
Xcopy "C:\dvo32\*.*" "E:\Lohnverrechnungs PC\Dvo32\" /D /E /R /H /C /K /Y
Xcopy "C:\EURONORM\*.*" "E:\Lohnverrechnungs PC\EURONORM\" /D /E /R /H /C /K /Y
Xcopy "C:\dvo32\*.*" "\\LOHN\Sicherung\Buchhaltung PC\Dvo32\" /D /E /R /H /C /K /Y
Xcopy "C:\EURONORM\*.*" "\\LOHN\Sicherung\Buchhaltung PC\EURONORM\" /D /E /R /H /C /K /Y
Все проблемы - в нежелании почитать описание команды xcopy /?. Там всё написано. »
Теперь почитал, но пока еще темный лес :(
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.