CMD/BAT - Скрипт FOR и DIR

Аватара пользователя
iskurt

CMD/BAT - Скрипт FOR и DIR

Сообщение iskurt »

Уважаемые, не могу понять... почему не срабатывает....

Предистория:

На локальном сервере есть папка с подкаталогами различных бэкапов.

Необходимо на удаленном компе создавать папку с текущей датой и тупо туда скопировать ПОСЛЕДНИЕ СОЗДАННЫЕ бэкапы из подкаталогов.

Когда делаю эту процедуру в контретном подкаталоге, т.е указываю *.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

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение megaloman »

Код:

Код: Выделить всё

@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




Что не так?

[spoiler]1. Например, exit вызывает не только выход из цикла, но и завершение батника. Из-за этого обрабатывается только первая выданная командой Dir папка. Читаем хелп по команде Exit /?

2. Не понимаю, зачем нужно "%sFolderName::=-%"[/spoiler]
Аватара пользователя
iskurt

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение iskurt »

iskurt,
Цитата iskurt:



%date:~6,4%-%date:~3,2%.%date:~0,2%
CMD/BAT - Скрипт FOR и DIR




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

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение iskurt »

Цитата:



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

Файл не найден

Для продолжения нажмите любую клавишу . . .



К сожалению и это так же не работает...
Аватара пользователя
y--

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение y-- »

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



Опять так, может 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 )

CMD/BAT - Скрипт FOR и DIR








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

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение iskurt »

iskurt,

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


Цитата megaloman:



Echo copy "%~dp1%%v" "%sFolderName%\"
CMD/BAT - Скрипт FOR и DIR




так что ты явно что-то переделывал Изображение

Этот кусок важен для отладки
Аватара пользователя
y--

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение y-- »

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



Спасибо, дружищщеее....y--, megaloman, !!!
Аватара пользователя
iskurt

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение iskurt »

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



Спасибо, дружищщеее....y--, megaloman, !!!
Аватара пользователя
y--

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение y-- »

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

Re: CMD/BAT - Скрипт FOR и DIR

Сообщение iskurt »

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

Вернуться в «Скриптовые языки администрирования Windows»