Компьютерный форум 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=319752)

JKop 14-10-2016 14:48 2678059

Скопировать файлы из папок по определенному названию
 
Здравствуйте!
Можете подсказать, как реализовать следующее:
Есть папка С:\Nodes, в ней одна или несколько папок такого формата - RU.*.*
Нужно пройтись по каждой такой папке и внутри из папки Config скопировать файлы config.xml.
И разложить эти файлы так: на С:\backup, здесь для каждого файла создавать папку с тем же названием RU.*.* (то есть название папки такое же, как то откуда мы его взяли).
Надеюсь, всё понятно написано)
Заранее благодарю за помощь.

alpap 14-10-2016 23:50 2678240

Код:

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 2678280

Код:

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


JKop 18-10-2016 12:49 2679351

alpap, ошибка: Синтаксическая ошибка в имени файла, имени папки или метке тома.

JKop 18-10-2016 13:05 2679362

megaloman, спасибо, всё работает. А не могли бы Вы пояснить, какой параметр за что отвечает, я новичок в этом деле.
Просто мне еще нужно по аналогии запрограммировать обратную операцию - восстановление. Хотелось бы разобраться.

Кроме этого нарисовались еще условия: для каждого запуска скрипта записывать всё в отдельный лог-файл.
И еще: при каждом запуске скрипта на С:\backup будет создаваться папка с названием - текущая дата и время, а в нее уже будут писаться папки Ru.*.* . С этим разобралась.
Соответственно при восстановлении (другой скрипт) пользователю должен вывестись список всех таких папок, пользователь должен выбрать ту, которая ему нужна, и далее уже восстановление файлов Config.xml

Жду посильной помощи)
Спасибо!

megaloman 18-10-2016 13:36 2679376

JKop, Пользователь входит в систему под своим уникальным именем? Мне не нравится идея выбора пользователем имени папки при восстановлении.

JKop 18-10-2016 13:59 2679383

megaloman, нет, не под уникальным. А чем не нравится?

megaloman 18-10-2016 15:43 2679421

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

Что конкретно не понятно?

JKop 18-10-2016 15:59 2679431

megaloman, не пойму, запускаю скрипт, ничего не происходит. Почему в коде появился диск Z: - поменяла на С:

megaloman 18-10-2016 18:38 2679486

JKop, Виноват! У меня для отладки существует диск Z: , а Вам надо C:. Я в спешке выпустил это из виду. Плюс еще допустил погрешности. Я исправил скрипт, возьмите именно его, испытайте.

JKop 20-10-2016 17:42 2680187

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 2680540

Я не читатель, я писатель :), поэтому в Вашем коде не сильно копался. Как я понял, Вы выбираете бэкап за определённую дату-время и восстанавливаете все конфиги, которые там есть.
Попробуйте
Код:

@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 кодировке.
Повторюсь, мне всё это не нравится, при нескольких пользователях такие неконтролируемые возможности приведут к конфликтам.

tyt 21-10-2016 22:48 2680599

megaloman,
Не могли бы и мне помочь создать батник для запуска копирования(когда нужно-дамы запустят).
Нужно копировать измененные файлы из папки C:\Dvo\Bu в домашней сети на \\USB\Dvo\Bu (написал USB так как не помню название съемного носителя)это для одного компьютера
и для другого из
C:\Dvo\St в \\USB\Dvo\St

megaloman 21-10-2016 23:25 2680606

Цитата:

Цитата название съемного носителя
\\USB\Dvo\Bu \\USB\Dvo\St

Так обозначаются не съёмные носители, а сетевой путь на компьютер c именем USB на папку с общим доступом Dvo и подпапки в этой папке Bu и St. Что Вы имеете ввиду? Что Вы понимаете под названием съемного носителя?
Если это и в самом деле сетевые пути, то батник из одной строки:
Код:

xcopy "С:\Dvo\Bu\*.*" "\\USB\Dvo\Bu\" /E /D /Y
Аналогично и для St
А еще лучше без батника: создать значок на xcopy и добавить туда параметры.

tyt 21-10-2016 23:48 2680609

megaloman,
Это я со своего взял-у меня в сети есть ресивер \\VUDUO2\Harddisk
А у них к одному подключен жесткий диск через USB и второй компьютер его видит через сеть.
Я в понедельник посмотрю точный путь

JKop 25-10-2016 18:08 2681577

megaloman, спасибо, всё работает)
Тоже взялась за копирование файлов на другой сервер в домене.
Делаю по вашему примеру:
Цитата:

Цитата 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 2681625

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 ?

Возможно, файервол сервера блокирует доступ на папку.
В общем, больше идей нет.

tyt 28-10-2016 19:24 2682564

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 2682586

Цитата:

Цитата Фонвизин
Ах, мой батюшка! Да извозчики-то на что ж? Это их дело. Это-таки и наука-то не дворянская. Дворянин только скажи: повези меня туда, свезут, куда изволишь.

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


tyt 28-10-2016 21:43 2682603

Цитата:

Цитата megaloman
Все проблемы - в нежелании почитать описание команды xcopy /?. Там всё написано. »

Теперь почитал, но пока еще темный лес :(


Время: 06:25.

Время: 06:25.
© OSzone.net 2001-