Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Скрипт FOR и DIR

Ответить
Настройки темы
CMD/BAT - Скрипт FOR и DIR

Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: iskurt
Дата: 22-09-2016
Описание: Добавил результат
Уважаемые, не могу понять... почему не срабатывает....
Предистория:
На локальном сервере есть папка с подкаталогами различных бэкапов.
Необходимо на удаленном компе создавать папку с текущей датой и тупо туда скопировать ПОСЛЕДНИЕ СОЗДАННЫЕ бэкапы из подкаталогов.
Когда делаю эту процедуру в контретном подкаталоге, т.е указываю *.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()

Что не так?

Отправлено: 18:39, 22-09-2016

 

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@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::=-%"

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 22-09-2016 в 22:48.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:20, 22-09-2016 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


iskurt,
Цитата iskurt:
%date:~6,4%-%date:~3,2%.%date:~0,2% »
и учти что этот кусочек зависим от национальных настроек.

-------
Ты это - заходи если что...


Отправлено: 09:16, 23-09-2016 | #3


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата:
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
Файл не найден
Для продолжения нажмите любую клавишу . . .
К сожалению и это так же не работает...

Отправлено: 09:27, 23-09-2016 | #4


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Опять так, может 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 )
»
Тут я смотрю те же грабли, только с боку...

Отправлено: 09:46, 23-09-2016 | #5

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


iskurt,
в твоем логе я не увидел результатов отработки вот этого куска кода:
Цитата megaloman:
Echo copy "%~dp1%%v" "%sFolderName%\" »
так что ты явно что-то переделывал
Этот кусок важен для отладки

-------
Ты это - заходи если что...


Отправлено: 10:35, 23-09-2016 | #6


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 11:05, 23-09-2016 | #7

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


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

-------
Ты это - заходи если что...

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:25, 23-09-2016 | #8


Новый участник


Сообщения: 16
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:03, 23-09-2016 | #9

y-- y-- вне форума

Старожил


Сообщения: 231
Благодарности: 62

Профиль | Отправить PM | Цитировать


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

-------
Ты это - заходи если что...


Отправлено: 14:38, 23-09-2016 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Скрипт FOR и DIR

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
D-Link - D-Link DIR-100+DIR-300 соединить чтоб работала вафля Zohon Сетевое оборудование 1 11-04-2013 21:10
D-Link - D-Link Dir-100 и Dir 300 maestro10 Сетевое оборудование 1 11-10-2011 15:09
D-Link - dir-300 NRUB5 + dir-320 "От Олега" korsh Сетевое оборудование 10 08-10-2011 18:56
Router - Помогите определится с роутером <Dir-320, Dir-400> cezar Сетевое оборудование 0 22-09-2010 15:05
Wireless - Соединение двух Маршрутизаторов Wi-Fi <D-Link DIR-300 и DIR-320> Limp-IP Сетевое оборудование 8 04-08-2010 17:58




 
Переход