Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 2

Автор: Elroir
Дата сообщения: 03.04.2007 01:17
Bablo
Что именно происходит?
Автор: Nagual
Дата сообщения: 03.04.2007 03:18
Bablo
у меня все пашет
проверь, разрешен ли пинг
если да, то попробуй скопировать код между здвездочками, в начале шапки написано о кривизне форума
***
@echo off
ping -n 1 www.google.com | find "TTL="
if %errorlevel%==0 (echo Ping is GOOD) else (echo Ping is BAD)
pause
***
Автор: Kac
Дата сообщения: 03.04.2007 04:55
Доброе время суток!
Мне нужно
1. удалить старые файлы -определяю по дате создания.
2. оставить МИНИМУМ Х копий
Все вроде работает НО для проверки случайно увидел - если название файла !!!!!!!!!!!!!!.sql -то имени файла не видит! Оно пустое если начинается с !. Как устранить? Вот текущий код

@echo off
SetLocal enabledelayedexpansion
set tmp_file=$tmp$.tmp
set Max_copy=3
:: Ниже указать любой путь и маску файлов главное чтоб в названиии был первый символ !
set find_mask=*.sql
set c=0

:: Сначала спуливал в файл но потом отказался от этого
dir /-C /T:C /O:-D %find_mask% >>%tmp_file%

:: Удаляю шапку и хвост. Остается токо список файлов с датой отсортированый в нужном порядке.
For /f "eol= delims=$" %%i in ('dir /-C /T:C /O:-D %find_mask%') Do (set /a c+=1)&(^
if !c! GTR %Max_copy% (echo %%i will be deleted !c!)
)
endlocal
exit
Автор: Elroir
Дата сообщения: 03.04.2007 09:17
Kac
У меня и dir и for нормально выдают названия файлов, начинающиеся со знака "!".
Приведи листинг файлов, которые у тебя не показываются.
Кстати, можно сделать код проще:

Код:
@echo off
set Max_copy=3
set find_mask=*.sql
for /f "skip=%Max_copy% tokens=*" %%i in ('dir /b /tc /a-d /o-d %find_mask%') Do (echo %%i will be deleted)
Автор: Kac
Дата сообщения: 03.04.2007 09:42
Спасибо! Интересно...
вот теперь мой код
@echo off
SetLocal enabledelayedexpansion
:: Для теста поставил чтобы ВСЕ имена вывела - 0
set Min_copy=0
set Arc_Mask=d:\*.sql
set c=0
For /f "delims=$" %%i in ('dir /B /TC /A-D /O-D %Arc_Mask%') Do (set /a c+=1)&(^
if !c! GTR %Min_copy% echo del %%i)
endlocal
exit

Вот список файлов корневика Д *.sql
!result!.sql
copy_ora.sql
!!!!!!!!!!!!!!!!!!!!!!!.sql
аудит.sql

этот скриптик выводт на экран
del copy_ora.sql
del .sql //подразумевается !result!.sql
del .sql //подразумевается !!!!!!!!!!!!!!!.sql
del аудит.sql

Ничего не понимаю

Добавлено:
причем если разрешить эхо - видно что подставляет все верно...
вот кусок кода
& (if !c! GRT 0 (echo del !result!.sql)
а вот на экран выводит del .sql
Автор: Elroir
Дата сообщения: 03.04.2007 10:03
Kac
Ты используешь инструкцию "SetLocal enabledelayedexpansion". При этом все, что находится между двумя восклицательными знаками, интерпретируется, как переменная. Так как переменной result у тебя нет - соответственно подставляется пустое место.
Либо изменяй свой код, либо используй мой.
Автор: Kac
Дата сообщения: 03.04.2007 10:04
Тока щас заметил как вы используете СКИП.
Потрясающе!
В консоли не новичок но такие вкусности приходят токо с опытом!
Потрясающе!
ЗЫ. Но тем не менее ! - заколдовано но не наработает!

Добавлено:
Все понял спасибо!
Буду рыть!

Добавлено:
Даже в таком виде при небольшой доработке он может пригодиться многим админам кому по роду своей деятельности приходиться бэкапить что либо!
Чем он отлдичается от ранее предложеный на этом форуме вариантов? Тем что он В ЛЮБОМ СЛУЧАЕ сохранит последнии Н копий! Даже если сервер не будет работать полгода а потом включиться и забывший админ запустит этот скрипт - СТАРЫЕ бэкапы не потруться! В приведеных выше примерах можно указывать сколько ДНЕЙ хранить... Но позвольте мне например 28 дней много (дампы огромные). Надо 6! А представьте на новогодние каникулы сервак потушился на 10 дней? Да мало ли что... Если бы я воспользовался другим примером то после отработки - у меня был бы токо НОВЫЙ дамп. А все предыдущие стерлись .
Это было предисловик.

Запутался совсем. Может кто посмотрит батник...

rem @echo off // отключил для проверки
SetLocal
rem enabledelayedexpansion // отключил по совету Elroir

@Title Export Script

set s_exp_start=Export starting... // Просто надписи в лог какие буду использовать...
set s_exp_fin=Export finished...
set s_arc_start=Archiving starting...
set s_arc_fin=Archiving finished...

set glog=D:\General_File.log // здесь указать свой ЛОГфайл весь вывод туда валю...
set arc_path=c:\progra~1\winrar\ // путь к рар.ехе - но если установить ниже set debug_1=>-1 то путь не потребуется...
set ora_path=c:\oracle\ora92\bin\ //путь к утилите ехр.ехе но если установить ниже set debug_0=>-1 то путь не потребуется...

set dmp_path=d:\ //путь куда будут валиться файлы экспорта
set log_path=d:\ //путь куда будут валиться ЛОГИ экспорта
set rar_path=d:\ ////путь куда будут складываться заархивированые файлы ЭКСПОРТА и ЛОГ файлы

set conn_exp=scott/tiger@server //строка подключения но нам она не важна мы проверяем в тестовом режиме! все ДЕБАГ параметры НЕ ОТРИЦАТЕЛЬНЫ!

set VDATE=%DATE:~6,4%_%DATE:~3,2%_%DATE:~0,2%

set dmp=%dmp_path%fe_ngk_%vdate%.dmp //сгенерированый ежедневно имя фала экспорта
set log=%log_path%lfe_ngk_%vdate%.txt //сгенерированый ежедневно имя файла ЛОГА экспорта
set rar=%rar_path%%vdate%.rar //сгенерированый ежедневно имя архива!
set Arc_Mask=%rar_path%*.rar //по этой маске буду искать все файлы архивные и удалять потом старейшие
set rarlog=%log_path%arc.lox // по этому файлу буду определять заархивировались ДАМП и ЛОГ файлы удачно или нет. Если он есть то произошла какая то ошибка! ЕррорЛевел для архиватора не действует вроде.

::!!!
set Arc_Mask=%rar_path%*.sql //для проверки ищу любые файы в данный момент sql
::!!!

set rar_par=m -ep -y -m1 -md4096 -idp -ilog%rarlog% //параметры архиватора

set Min_copy=6 // сколько минимально надо оставлять архивных файлов
::!!!
set Min_copy=0 // для теста установил - чтобы ни одного! все старые удалять
::!!!
set debug_0=0 //если <0 то работать в нормальном режиме,0-тестовый режим и типа первая утилита exp.exe отработала без ошибок. >0 - работа завершилась с какой то ошибкой
set debug_1=0 ////если <0 то работать в нормальном режиме,0-тестовый режим и типа fhархиватор отработал без ошибок. >0 - работа завершилась с какой то ошибкой

echo ==================== %DATE% %TIME:~0,-3% ==================== >>%glog%
echo exp=%ora_path% >>%glog%
echo dump=%dmp% >>%glog%
echo log=%log% >>%glog%
echo rar=%rar% >>%glog%
echo Arc_Mask=%Arc_Mask% >>%glog%
echo debug_0=%debug_0% >>%glog%
echo debug_1=%debug_1% >>%glog%

::Export
::Тут в переменную exp_var кидаю errorlevel или debug_0 в зависимости от режима
::в тестовом режиме сам генерю файл дампа и лога без использовании утилиты экспорта.
:: не работает строка echo %s_exp_fin% at %TIME:~0,-3% with Errorlevel=%exp_var% >>%glog% в логе ErrorLevel= пустому значению
echo Start Export - %TIME:~0,-3% >>%glog%
rem set exp_var=
if %debug_0% LSS 0 (
%ora_path%\exp ^
%conn_exp% full=Y buffer=1280000 consistent=Y compress=N ^
file=%dmp% log=%log%
set exp_var=%ERRORLEVEL%
) else (set exp_var=%debug_0%)&&(echo Debug_0=%exp_var% log file. >%log%)
if %debug_0%==0 (echo Debug_0 dump file. >%dmp%)
echo %s_exp_fin% at %TIME:~0,-3% with Errorlevel=%exp_var% >>%glog%


exit
pause

::Archive
if %exp_var%==0 (
echo _______________________________________________________ %s_exp_fin% OK >>%glog%
del "%rarlog%" >nul 2>nul
echo %s_arc_start% at %TIME:~0,-3% >>%glog%
if %debug_1% LSS 0 (%rar_path%\rar "%rar_par%" "%rar%" "%dmp%" "%log%") else (^
if %debug_1% gtr 0 (echo Debug Error in archiv=%debug_1% >%rarlog%^
) else (
Echo Debug Mode. Arc archived files mode. DON'T DEL Files "%log%" and "%dmp%"
del /P "%log%"
del /P "%dmp%"
)
)
if EXIST "%rarlog%" (type %rarlog% >>%glog%)&(^
echo __________________________________ %s_arc_fin% INCORRECT at %TIME:~0,-3%>>%glog%
) else (echo _________________________________________ %s_arc_fin% OK at %TIME:~0,-3%>>%glog%^
)&(set c=0
pause
:: Delete old
if %Min_copy%==0 (set var1=) else (set var1= skip=%Min_copy%)
For /f "delims=$%var1%" %%i in ('dir /B /TC /A-D /O-D %Arc_Mask%') Do (del /P d:\%%i)
)
) else (echo _________________________________________ %s_exp_fin% INCORRECT at %TIME:~0,-3% >>%glog%)
endlocal
exit


For /f "delims=$" %%i in ('dir /B /TC /A-D /O-D %Arc_Mask%') Do (set /a c+=1)&(^
if !c! GTR %Min_copy% echo del %rar_path%%i)
rem if !c! GTR %Min_copy% (call arce %%i))

arce
rem set tmp=%1
rem echo pushd
pause
if %debug_2% lss 0 (del %rar_path%%1 >>%glog%) else (echo del %rar_path%%1 >>%glog%)
rem echo popd
exit /b


Автор: StanislavG
Дата сообщения: 03.04.2007 12:20
Elroir

Цитата:
arj32 m w:\nbumail\journal\jour%prevd%%prevm%.dh0 w:\nbumail\journal\ *.old *.rsa *.ind *.key *.pud *.rsa *.lo1 *.er1 *.err *.nbu

Вот строка архивирования после выполнения команды у меня должен получиться архив jour3103.dh0 но у меня получаеться jour0003.dh0 В чем может быть причина?

Добавлено:
Elroir
И я вспомнил чего заремил те строчки просто у меня должен получаться архив
Цитата:
jour0304.dh0
а если раз ремлить те строчки он выходит
Цитата:
jour034.dh0


И чего он собирает весь месяц, а в конце не собирает объясни мне в чем проблема.
Автор: Maza Faka
Дата сообщения: 03.04.2007 14:51
StanislavG
Вот эта строка

Код:
for /F "usebackq tokens=1,2,3,4 delims=. " %%A IN (`"dir /T:C %1 | find %1"`) DO...
Автор: StanislavG
Дата сообщения: 03.04.2007 15:46
Maza Faka
объясни в чем секрет?
Автор: Elroir
Дата сообщения: 03.04.2007 17:41
StanislavG

Цитата:
И чего он собирает весь месяц, а в конце не собирает объясни мне в чем проблема

Там сложнее высчитывать предыдущий день - 1 (первое число) минус 1 дает 0, поэтому надо делать проверку, сколько дней было в предыдущем месяце и подставлять это число.

Цитата:
Вот строка архивирования после выполнения команды у меня должен получиться архив jour3103.dh0 но у меня получаеться jour0003.dh0 В чем может быть причина?

Это как-раз из-за тех закомментированых строк.

Цитата:
а если раз ремлить те строчки он выходит jour034.dh0

Добавь следующие строчки:

Код:
...
if not "%fd%"=="%prevd%" ( set "match=false")
if not "%fm%"=="%prevm%" ( set "match=false")
if not "%fy%"=="%prevy%" ( set "match=false")
if %prevd% LSS 10 set "prevd=0%prevd%"
if %prevm% LSS 10 set "prevm=0%prevm%"
if %prevy% LSS 10 set "prevy=0%prevy%"

if "%match%"=="true" (
copy c:\tcpfoss.452\%4 c:\tcpfoss.452\jnin\test\
...
Автор: igor_andreev
Дата сообщения: 03.04.2007 17:49
StanislavG
А знаешь, почему твой батник периодически сбоит и мурыжышься ты с ним уже кажется месяца три-четыре? Потому что он некрасивый, мне дык сразу не понравился Крылатая фраза Туполева "красивые самолеты хорошо летают" только кажется шуткой, на самом деле в каждой шутке есть доля...
В общем-то почти вся работа с датами в батниках реализуется некрасиво. Даже уже не очень помню, что твой батник толком делает, кажется надо заархивировать файлы, созданные вчера. Давай я тебе подарю vbscript

Код:
If WScript.Arguments.Count=1 Then
Set fso = CreateObject("Scripting.FileSystemObject")
CompareDate=DateSerial(Year(Date), Month(Date), Day(Date)-1)
Set fc = fso.GetFolder(WScript.Arguments.Item(0)).Files
For Each f in fc
FileCreatedDate=DateSerial(Year(f.DateCreated), Month(f.DateCreated), Day(f.DateCreated))
If FileCreatedDate=CompareDate Then WScript.Echo f.Path
Next
End If
WScript.Quit
Автор: Elroir
Дата сообщения: 03.04.2007 17:54
igor_andreev

Цитата:
Потому что он некрасивый, мне дык сразу не понравился

Камень в мой огород - я его как-то криво построил
Мне тоже не понравилось, а переписывать лень было. Там вчерашняя дата высчитывается в каждой итерации for-a

Цитата:
Бери-бери, скрипт фриваре и опенсорс



Добавлено:
P.S. Ты так всех с батников на VB скрипты уведешь
Автор: igor_andreev
Дата сообщения: 03.04.2007 18:57
Elroir

Цитата:
Камень в мой огород

Ну вот это пряник в твой огород от Kac

Цитата:
Тока щас заметил как вы используете СКИП.
Потрясающе!
В консоли не новичок но такие вкусности приходят токо с опытом!
Потрясающе!

и я к нему присоединяюсь, тоже чуть сложней конструкцией пользовался до сего дня

Цитата:
Ты так всех с батников на VB скрипты уведешь

Я еще и на KIX чуть-чуть умею...
Никого-никуда не перевожу. Была одна организация в прошлом веке и был у нее принцип “для достижения цели все средства хороши”. Организация ублюдочная, а принцип, по отношению к компу - нормальный. У мну нет никаких условностей, типа "только средствами батников", "только средствами OC". Надо, чтоб работа была сделана - надо сделать и неважно чем пользоваться, *.cmd, *.vbs или установить для этого прогу весом в 200 Мб. Главное, чтоб все на компе крутилось-вертелось без запинки и с максимально меньшим участием человека, бо на "пиво попить" времени мало останется.

Автор: Elroir
Дата сообщения: 03.04.2007 19:29
igor_andreev

Цитата:
У мну нет никаких условностей, типа "только средствами батников", "только средствами OC". Надо, чтоб работа была сделана - надо сделать и неважно чем пользоваться, *.cmd, *.vbs или установить для этого прогу весом в 200 Мб.

Полностью согласен. Я просто часто сталкивался с ситуациями, когда надо было не у себя на компе что-то сделать, а у другого человека, который даже не чайник , а так - умеет мышкой по десктопу водить. Вот поди объясни ему по телефону или мейлом, что утилиту надо кинуть в System32 директорию или добавить что-то в path. Поэтому и возникает потребность не использовать сторонние утилиты, а работать только со средствами самой системы. Как и у тебя, у меня есть директория с кучей всяких утилит - лежат они там с 199X-забытого года, но иногда очень помогают
В общем то, что ты написал в последнем предложении - у каждого свои запросы, но если нет ограничений - использовать нужно то, что проще/быстрее/дает больше автоматизации.
Автор: igor_andreev
Дата сообщения: 03.04.2007 19:58

Цитата:
Я просто часто сталкивался с ситуациями, когда надо было не у себя на компе что-то сделать,

Тогда да конечно, надо стараться извернуться одним батником. Но StanislavG вроде как для себя делает - имхо пользуйся, чем хочешь.

Цитата:
у меня есть директория с кучей всяких утилит - лежат они там с 199X-забытого года,
Адвансед юзер адназначна Я в 1994-м со свойственной мне решительностью сел в первый раз за комп, абсолютно ничего в нем не понимая, там были какие-то буковки на черном фоне(Нортон наверно) и пока никого рядом не было, минут за пять удалил кучу каких-то файлов и угробил ОС. Потом лет шесть к компу близко не подходил, ну для этого бухгалтера-секретари вокруг были.
Автор: Elroir
Дата сообщения: 03.04.2007 20:21
igor_andreev
Кстати, вопрос касающийся VBScript:
я как-то видел батник совмещенный со скриптом в одном файле .cmd. Там то ли скрипт запускал батник, то ли наоборот, но они точно жили в одном и том же файле. Никак не могу вспомнить где я это видел и как оно было сделано. Может знаешь?
Автор: NIKZZZZ
Дата сообщения: 03.04.2007 21:10
Elroir

Цитата:
я как-то видел батник совмещенный со скриптом в одном файле .cmd.

VBScript - обычный текстовой файл с расширением .vbs . Запускается так-же, как .cmd.

Echo ...... > test.vbs
Echo ...... >> test.vbs
Echo ...... >> test.vbs
.......
test.vbs %1 %2 .....


Автор: igor_andreev
Дата сообщения: 03.04.2007 21:30

Цитата:
Там то ли скрипт запускал батник, то ли наоборот, но они точно жили в одном и том же файле.

hybrid.bat наверно http://www.radiks.net/~jimbo/demented/hybrid.htm
Или похожий какой-нибудь.
Автор: Elroir
Дата сообщения: 03.04.2007 22:07
NIKZZZZ
Вся фишка в том, чтобы не создавать отдельный vbs файл, а использовать тот же самый bat или cmd.
igor_andreev
Вот-вот - было что-то похожее. Спасибо!
Автор: Bablo
Дата сообщения: 03.04.2007 22:56
пинговалка заработала, оказывется проблема была в том что я назвал батник ping.bat
Всем спасибо
Автор: NIKZZZZ
Дата сообщения: 03.04.2007 23:00
Elroir
А вот как аналог на VBS написать, коменты там плохие, содержат, насколько помню <> .
Автор: igor_andreev
Дата сообщения: 04.04.2007 00:32
NIKZZZZ
Аналог чего? Если hybrid.bat - то именно так не получится, многострочные комменты в vbscript не поддерживаются. В *.vbs только одинарная кавычка в начале каждой строки

Код: ' single-line vbscript comment
Автор: euheny
Дата сообщения: 04.04.2007 02:24
NIKZZZZ

Цитата:
Работа с текстом

sbs2
Старая досовская програмуля - цепляет кучу файлов (16bit support)
Помойму не то.

Я бы предпочёл сразу в HEX-е править.

Короче продолжаю поиск.
Автор: NIKZZZZ
Дата сообщения: 04.04.2007 09:25
igor_andreev

Цитата:
Этим гибридам в общем-то практического применения мало

Да в общем, согласен. Просто не нравится мне "Echo xxxx > file.xxx , особенно когда строк много.
Я , например использовал следующее следующее:

set x=rem уникальная строка
%X% text
%X% text
........
type %0 | find %X% > file.tmp
sbs2 "%X%" "" <file.tmp> file.xxx










Добавлено:

Цитата:
Если hybrid.bat - то именно так не получится, многострочные комменты в vbscript не поддерживаются.

Не обязательно коммент, можно просто многострочную команду, которая не мешает работе.
Автор: JohnRD
Дата сообщения: 04.04.2007 11:36
день добрый

подскажите пожалуста может ли gsar заменить строку такого вида

Код:
aaaa=????
Автор: igor_andreev
Дата сообщения: 04.04.2007 11:49
JohnRD
sed.exe сможет
Автор: Maza Faka
Дата сообщения: 04.04.2007 12:22
igor_andreev
А где учил VBS? Сам или на курсах каких? Если сам, то какую литературу посоветуешь?
Автор: KapralBel
Дата сообщения: 04.04.2007 12:25
Maza Faka
Дока по WSH
Автор: NIKZZZZ
Дата сообщения: 04.04.2007 13:03
Maza Faka
WSH - разное , подборка , что-то и по русски.
Книжка

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Сбой активации XP sp2


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.