Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 3

Модерирует : KLASS, IFkO

vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

   

vu1tur



Moderator-Saaber
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задачи на bat-файлах
(часть 1, часть 2)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:54 27-04-2007 | Исправлено: Elroir, 03:59 10-09-2007
    tricord



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет.
    Ежедневно в директорию d:\BackupDB скриптом делается backup  базы firebird  виде base_DATE.fbk (Например base_20070531.fbk), для того что бы не забивался диск необходимо удалять старые backupы, и оставлять последние 10. Как это можно сделать batником.

    Всего записей: 51 | Зарегистр. 28-06-2003 | Отправлено: 14:49 31-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    tricord

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    for /f "tokens=*" %%a in ('dir /b /s /o:-d D:\BackupDB\*.fbk') do (
    set /a count+=1
    if !count! gtr 10 del /q /f "%%a")
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 15:03 31-05-2007 | Исправлено: Maza Faka, 15:08 31-05-2007
    tricord



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka Большое спасибо
     
     
    Добавлено:
    Maza Faka Большое спасибо

    Всего записей: 51 | Зарегистр. 28-06-2003 | Отправлено: 15:10 31-05-2007
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    tricord, Maza Faka
    можно и без отдельного счетчика  
     
    for /f "tokens=* skip=10" %%a in ('dir /b /a-d /o-d D:\BackupDB\*.fbk') do del /q /f "%%~a"  

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 17:01 31-05-2007 | Исправлено: wolf0425, 17:06 31-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    vils007
    Скачай утилиту forfiles.exe кинь её в папку WINDOWS и запускай этот код:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    for /f "tokens=*" %%a in ('dir /b /a:d /s c:\w ^| find /i /v "c:\w\log"') do (
    forfiles /p %%a /d -1 /c "cmd /c rd /q @file">nul 2>&1
    forfiles /p %%a /d -1 /c "cmd /c del /q /f @file">nul 2>&1)
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 18:42 31-05-2007
    chelobey

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем. Возможно, такая задача вас заинтересует, а ее решение очень мне поможет.
    Заранее спасибо.
     
    Вот в чем загвоздка: при подключении к Интернет посредствам модемного соединения скачивается некоторый неизвестный объем информации, после чего соединение закрывается. Это при положительном результате (т.е. файлы удачно качнулись). Но если скачивание не произошло по причинам недоступности адреса (берем во внимание автоматический выбор адресов из двух десятков) или каких других трудностей?
    Как задать условие, при котором бы при подобных обстоятельствах соединение закрывалось?
    Есть следующие мысли: 1. слежение за трафиком (что-то вроде «времени простоя соединения» windows) и 2. слежение за состоянием файла, который при каждом подключении должен в идеале обновляться (время изменения, размер).
     
    И еще, сведения обо всех попытках подключения записывались и дописывались бы далее в log.txt с указанием даты и времени.
     
    С подключением и закрытием соединения все ясно - rasdial, что можно сделать с остальным?

    Всего записей: 78 | Зарегистр. 31-05-2007 | Отправлено: 22:24 31-05-2007
    vils007



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не совсем понятно - файлы, которые должны остаться (за последний день) - это файлы в С:\w\log? То есть и оттуда надо удалить некоторые файлы?
     
    в папке С:\w\log ни чего не удаляем никогда. А в С:\w удаляем всё что старше одного дня.

    Всего записей: 4 | Зарегистр. 31-05-2007 | Отправлено: 02:39 01-06-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vils007
    Тогда код, который предложил Maza Faka - это именно то, что тебе нужно.
    Только четвертая строчка у меня вызывает сомнения. Попробуй с ней - если будут удаляться директории, которые удаляться не должны - убери ее.  


    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 02:57 01-06-2007
    euheny



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нужно определить чья видеокарта (nv или ati) стоит на компе.Драйвер не установлен.
    Какие идеи ?

    Всего записей: 4174 | Зарегистр. 22-11-2006 | Отправлено: 03:46 01-06-2007
    vils007



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka спасибо.
     
    Elroir спасибо.
     
    Этот forfiles.EXE там хронятся какие-то специальные процедуры для работы с файлами?

    Всего записей: 4 | Зарегистр. 31-05-2007 | Отправлено: 04:15 01-06-2007 | Исправлено: vils007, 04:24 01-06-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    vils007

    Цитата:
    Этот forfiles.EXE там хронятся какие-то специальные процедуры для работы с файлами?

    forfiles - это майкрософтовская утилита для работы с множеством файлов, выделенных по определенному признаку. В частности, эта утилита позволяет очень легко находить (и, соответствено, обрабатывать) файлы/директории по дате изменения - до определенного числа, после, столько-то дней назад и т.д.

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 05:09 01-06-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    chelobey
    Смотри в сторону wget. Wget - это консольный даунлоад менеджер,скачать, позволяет выводить STDOUT в лог, возвращает код ошибки "0", если закачка прошла успешно. Просто отслеживай код возврата и задавай условия, типа, если "0", то продолжаем дальше, если не "0", то преходим на метку...

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:32 01-06-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, как вычислить число дней между двумя датами, если есть переменная %fstbilddat%=17.12.2006, например, и переменная %date% с таким же форматом. Нужно в переменную %autobuild% поместить вычисленное число дней.
    Команду setlocal disabledelayedexpansion НЕ использовать, т.к. вызов этой подпрограммы будет производиться из цикла FOR и результат надо использовать в этом цикле!

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 08:56 01-06-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GORA2
    Вот решение с помощью батника:

    Код:
     
    @echo off
    set oldDate=17.12.2006
     
    set curDate=%date%
    set curDay=%curDate:~0,2%
    set curMonth=%curDate:~3,2%
    set curYear=%curDate:~-4%
     
    set lastdays="31 28 31 30 31 30 31 31 30 31 30 31"
     
    :count_
    if %curDay% lss 10 set curDay=%curDay:~-1%
    if %curMonth% lss 10 set curMonth=%curMonth:~-1%
    set /a count+=1
    set /a curDay-=1
    if "%curDay%"=="0" set /a curMonth-=1
    if "%curMonth%"=="0" set /a curMonth=12,curYear-=1
    set /a leap=curYear%%4
    if "%leap%"=="0" (set lastdays=%lastdays:28=29%) else (set lastdays=%lastdays:29=28%)
    if "%curDay%"=="0" for /f "tokens=%curMonth%" %%a in (%lastdays%) do set curDay=%%a
    if %curDay% lss 10 set curDay=0%curDay%
    if %curMonth% lss 10 set curMonth=0%curMonth%
    set myDate=%curDay%.%curMonth%.%curYear%
    if  %myDate%==%oldDate% (echo difference between %oldDate% and %date% = %count% days) else (goto count_)
     

    учитываются високосные годы. Уверен, что на WSH можно написать красивее, но, что умеем, то имеем

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 12:14 01-06-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Спасибо. Работает, но... уж очень медленно при большой разнице в датах
    Мне бы что то вроде этого
    Код:
    @echo off
    :_Autonum
    set fstbilddat=17.12.2006
    setlocal disabledelayedexpansion
    call ate2day "%date%"
    set autobuild=%w%
    call ate2day "%fstbilddat%"
    setlocal enabledelayedexpansion
    set /a autobuild=%autobuild%-%w%
    echo difference between %fstbilddat% and %date% = %autobuild% days
    pause
    GOTO :EOF
     
    ate2day
    set dat=%~1
    set /a y=%dat:~6,4%&set /a m=1%dat:~3,2%-100&set /a d=1%dat:~0,2%-100
    set /a w=(%y%-1901)*365+(%y%-1901)/4+%d%-1+(!(%y% %% 4))*(!((%m%-3)^&16))
    set /a w=(%w%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))
    GOTO :EOF
    Как говориться "почувствуйте разницу" (сразу признаюсь, код не мой, а "цельнотянутый" . Все меня здесь устраивает кроме этих setlocal Может как то можно переписать "математику" в ate2day дабы можно было обойтись без setlocal.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 12:55 01-06-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GORA2

    Цитата:
    Все меня здесь устраивает кроме этих setlocal

    Так удали строки с "setlocal", они там вообще не нужны, у меня без них отлично считает дни.
     Кстати, где взял этот код? И что подсчитывается здесь:

    Код:
     
    set dat=%~1  
    set /a y=%dat:~6,4%&set /a m=1%dat:~3,2%-100&set /a d=1%dat:~0,2%-100  
    set /a w=(%y%-1901)*365+(%y%-1901)/4+%d%-1+(!(%y% %% 4))*(!((%m%-3)^&16))  
    set /a w=(%w%+(%m%-1)*30+2*(!((%m%-7)^&16))-1+((65611044^>^>(2*%m%))^&3))
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 14:27 01-06-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    Цитата:
    Так удали строки с "setlocal", они там вообще не нужны
    Не скажите. Считать то оно считает, но вот правильно или нет - вопрос? У меня в батнике стоит setlocal enabledelayedexpansion, а это только подпрограмма и для ее нормальной работы нужно делать setlocal disabledelayedexpansion. Можете убедиться сами если поставите echo %y% %m% %d% %w% в конце подпрограммы date2day. Значения %w% при включенном и отключенном delayedexpansion будут различны
    Цитата:
    Кстати, где взял этот код?
    Да здесь кто то недавно давал ссылку на hk_batch.zip, а это от туда.
    Цитата:
    И что подсчитывается здесь:
    Это цитата из источника:
    Цитата:
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    :: convert the date in %y% %m% %d% to the number of days (%w%) ::
    :: since 1901  (day 0 is 1. Jan. 1901)                         ::
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

     
     
     
     

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 14:47 01-06-2007
    SerP and MoloT

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ребят, пытался чтото сделать.. но не получилось.. ибо не писал никогда и ничего, задача такая, нужно с одного сервака вин 2000 сп4 каждое утро в определённое время копировать часть файлов на другой сервак вин 2000 сп4 в определённую дирректорию... помогите лузеру.. плиз!

    ----------
    save your planet, kill yourself
    "Turn on, tune in, drop out"

    Всего записей: 421 | Зарегистр. 07-07-2005 | Отправлено: 15:05 01-06-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    SerP and MoloT
    По каким параметрам определяют ккие файлы надо копировать
    * по списку
    * по изменению
    * др.

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 15:11 01-06-2007
    SerP and MoloT

    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    KapralBel
    ну... по названию.. т.е. на "сервере 1" в папке E:\прайсы\ есть файлики  с одним и тем же названием содержимое которых меняется ежедневно, тупо их нужно скопировать на другой "сервер 2" \\ds\обновлённые прайсы\ каждое утро...и учесть чтоб на "сервере 2" копируемые прайсы с "сервера 1" автомотически заменяли старые прайсы ибо название у них так и должно быть одинаковым

    Всего записей: 421 | Зарегистр. 07-07-2005 | Отправлено: 15:24 01-06-2007 | Исправлено: SerP and MoloT, 15:28 01-06-2007
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 3
    vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru