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

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

iskurt 22-09-2016 18:39 2671223

Скрипт FOR и DIR
 
Уважаемые, не могу понять... почему не срабатывает....
Предистория:
На локальном сервере есть папка с подкаталогами различных бэкапов.
Необходимо на удаленном компе создавать папку с текущей датой и тупо туда скопировать ПОСЛЕДНИЕ СОЗДАННЫЕ бэкапы из подкаталогов.
Когда делаю эту процедуру в контретном подкаталоге, т.е указываю *.bak - всё супер гут. Но как только поднимаюсь на уровень выше и начинаю делать перебор по подкаталогам %%B\*.bak ... всё, мандец, приехал... :(
Код:

@echo off
cls
set sFolderName=%date:~6,4%-%date:~3,2%.%date:~0,2%
mkdir \\COMP1\d$\Backup_1c\"%sFolderName::=-%"

set work_dir=d:\Backup
for /d %%B in (%work_dir%\*) do (
echo %%B
for /f %%v in ('dir %%B\*.bak /b /T:A /A:-D /O:-D') do >nul copy %%~fv \\COMP1\d$\Backup_1c\"%sFolderName::=-%" &exit
)
pause

============ результат================
Код:

Подпапка или файл \\COMP1\d$\Backup_1c\2016-09.22 уже существует.
d:\Backup\clients
Файл не найден
d:\Backup\diskont
Файл не найден
d:\Backup\kompl_nef
Файл не найден
d:\Backup\torg_nef
Файл не найден
d:\Backup\torg_pil
Файл не найден
d:\Backup\zakaz
Файл не найден
d:\Backup\zup_pil_82
Файл не найден
Для продолжения нажмите любую клавишу . . .

Меня интересует, почему строка dir %%B\*.bak /b /T:A /A:-D /O:-D перестает работать, как только я там любым способом указываю конкретный путь?
такое ощущение что при использовании команды DIR сразу теряется смысл команды for in()

Что не так?

megaloman 22-09-2016 22:20 2671254

Код:

@Echo Off
cls

Set "sFolderName=\\COMP1\d$\Backup_1c\%date:~6,4%-%date:~3,2%.%date:~0,2%"
Set "work_dir=D:\Backup"

MD "%sFolderName%" 2>nul

for /d %%B in ("%work_dir%\*") Do Call :BakCopy "%%B\*.bak"
pause
GoTo :Eof

:BakCopy
        FOR /F "usebackq delims=" %%v in (`dir %1 /b /T:A /A:-D /O:-D 2^>nul`) Do (
                Echo copy "%~dp1%%v" "%sFolderName%\"
                >nul copy "%~dp1%%v" "%sFolderName%\" &GoTo :Eof
        )
GoTo :Eof

Что не так?
1. Например, exit вызывает не только выход из цикла, но и завершение батника. Из-за этого обрабатывается только первая выданная командой Dir папка. Читаем хелп по команде Exit /?
2. Не понимаю, зачем нужно "%sFolderName::=-%"

y-- 23-09-2016 09:16 2671329

iskurt,
Цитата:

Цитата iskurt
%date:~6,4%-%date:~3,2%.%date:~0,2% »

и учти что этот кусочек зависим от национальных настроек.

iskurt 23-09-2016 09:27 2671333

Цитата:

d:\Backup\armadio
Файл не найден
d:\Backup\clients
Файл не найден
d:\Backup\diskont
Файл не найден
d:\Backup\kompl_nef
Файл не найден
d:\Backup\torg_nef
Файл не найден
d:\Backup\torg_pil
Файл не найден
d:\Backup\zakaz
Файл не найден
d:\Backup\zup_pil_82
Файл не найден
Для продолжения нажмите любую клавишу . . .
К сожалению и это так же не работает...

iskurt 23-09-2016 09:46 2671340

с созданием папки по дате всё пучком, папка создается, и в нее все прекрасно копируется, если я батник кидаю в папку где лежат бэкапы от одной базы. А если в общий каталог, то пипец.... не видит он файлов в подкаталогах.

Опять так, может FOR в связки с DIR не хочет работать с подкаталогами?
Или как правильно указать путь?
Цитата:

Цитата:

Цитата megaloman
for /d %%B in ("%work_dir%\*") Do Call
:BakCopy "%%B\*.bak"
pause
GoTo :Eof
:BakCopy
FOR /F "usebackq delims=" %%v in (`dir %1 /b /T:A /A:-D /O:-D 2^>nul`) Do (
Echo copy "%~dp1%%v" "%sFolderName%\"
>nul copy "%~dp1%%v" "%sFolderName%\"
&GoTo :Eof )
»


Тут я смотрю те же грабли, только с боку...

y-- 23-09-2016 10:35 2671354

iskurt,
в твоем логе я не увидел результатов отработки вот этого куска кода:
Цитата:

Цитата megaloman
Echo copy "%~dp1%%v" "%sFolderName%\" »

так что ты явно что-то переделывал ;)
Этот кусок важен для отладки

iskurt 23-09-2016 11:05 2671361

сто пудофф ничего не переделывал.... ИДИОТ я..... имя то компа COMP1 - это же выдуманное ;-)

Спасибо, дружищщеее....y--, megaloman, !!!

y-- 23-09-2016 11:25 2671369

iskurt,
и все-таки с переделанной датой(для независимости от национальных настроек):
Код:

@ECHO OFF
:: Указание пути для обработки
SET "WORK_DIR=d:\Backup"
:: Указание пути для хранения
SET "BACKUP_DIR=\\COMP1\d$\Backup_1c"

::Представление даты в нужном нам виде
ECHO wscript.ECHO YEAR(DATE) ^& "_" ^& RIGHT(0 ^& MONTH(DATE),2) ^& "." ^& RIGHT(0 ^& DAY(DATE),2)>"%TEMP%\tmp.vbs"
FOR /F %%i IN ('cscript "%TEMP%\tmp.vbs" //Nologo') DO SET "BACKUP_DIR=%BACKUP_DIR%\%%i"
IF EXIST "%TEMP%\tmp.vbs" DEL "%TEMP%\tmp.vbs"
ECHO Папка текущего дня "%BACKUP_DIR%"
IF NOT EXIST "%BACKUP_DIR%" MD "%BACKUP_DIR%"
IF NOT EXIST "%BACKUP_DIR%" (ECHO Не удалось создать папку текущего дня&EXIT 1)

FOR /d %%a IN ("%work_dir%\*") DO (
ECHO Папка для обработки "%%~a"
CALL :BakCopy "%%~a"
)
GOTO :EOF

:BakCopy
FOR /F "usebackq delims=" %%b in (`DIR "%~1" /B /T:A /A:-D /O:-D`) DO (
ECHO COPY "%%~fb" "%BACKUP_DIR%" &GOTO :EOF
)
GOTO :EOF

Лишние отладочные ECHO убрать и
Код:

ECHO COPY "%%~fb" "%BACKUP_DIR%" &GOTO :EOF
заменить на
Код:

COPY "%%~fb" "%BACKUP_DIR%" &GOTO :EOF

iskurt 23-09-2016 12:03 2671377

Это уже классная модификация - унифицированная.... Респект!

y-- 23-09-2016 14:38 2671424

iskurt,
Я правильно понимаю что у тебя речь идет об SQL-ных бэкапах?
Если так то этот скрипт тебе не нужен ;)
SQL бэкап можно делать на UNC-путь. При этом надо учесть только один нюанс: разрешение на запись должны быть для учетки от имени которой запущена служба "Агент SQL Server" (в случае когда делаешь через план обслуживания). Лучше всего создать специальную учетку для запуска SQL-ных служб, а если все-таки пускаешь от имени "Local System" то разрешение надо давать для учетной записи компьютера(в общей ситуации это возможно только в домене).
При такой ситуации очень удобно строить структуру хранения резервных копий с автоматическим управлением количества хранимых копий в зависимости от типа копии(например: дневных - 6, недельных - 5, месячных - 13, годовых - 50).

iskurt 23-09-2016 15:47 2671450

Цитата:

Цитата y--
Я правильно понимаю что у тебя речь идет об SQL-ных бэкапах?
Если так то этот скрипт тебе не нужен
SQL бэкап можно делать на UNC-путь. При этом надо учесть только один нюанс: разрешение на запись должны быть для учетки от имени которой запущена служба "Агент SQL Server" (в случае когда делаешь через план обслуживания). Лучше всего создать специальную учетку для запуска SQL-ных служб, а если все-таки пускаешь от имени "Local System" то разрешение надо давать для учетной записи компьютера(в общей ситуации это возможно только в домене).
При такой ситуации очень удобно строить структуру хранения резервных копий с автоматическим управлением количества хранимых копий в зависимости от типа копии(например: дневных - 6, недельных - 5, месячных - 13, годовых - 50). »

Совершенно в дырдочку.
На сервере было настроено только архивирование. Но до меня этим серваком никто не занимался.... жопа вобщем.
Взломали, заархивировали и запаролили все базы RARом.... Вымогатели получили 17000р.
Дали задание придумать что-нить.

Перенастроил полностью с нуля сервак, поставил домен, настроил скульагента, всё пучком, но к сожалению храним их только на этом же серваке. Провайдер за облачное хранение просит денег - директор хоть и понимает, что случилось, что вообще могли потерять всю инфу, все же я получил распоряжение придумать подешевле.
Ну вот и придумал: Ночью включаю удаленный комп, запускаю скрипт копирования *.bak, и комп автоматом выключается.
Думаю так надежней, чем просто на серваке.

y-- 23-09-2016 20:41 2671526

iskurt,
то же самое ты получишь выполнив бэкап по UNC-пути - во-первых шифровальщики даже сетевые диски(а у тебя не сетевой диск, а несмонтированный UNC) не шифруют, а во-вторых - время от времени надо не на сеть - на оптический накопитель скидывать ;), в третьих жать скульные бэкапы внешним средством - моветон, так как встроенный алгоритм(на базе ZIP) дает вполне приемлемую компрессию, но в разы быстрее(и восстанавливать удобнее).

PS - Вобщем если есть желание могу расписать подробно алгоритм - но тока в ПМ - тут это оффтоп.

Iska 23-09-2016 23:22 2671578

Цитата:

Цитата y--
во-первых шифровальщики даже сетевые диски(а у тебя не сетевой диск, а несмонтированный UNC) не шифруют, »

Ото ж. Ещё как шифруют, всё, до чего могут дотянуться.


Время: 20:26.

Время: 20:26.
© OSzone.net 2001-