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

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

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

evle (19-03-2008 19:44): Лимит страниц.
Задачи на bat-файлах 5
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 100 101 102 103

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 15:21 11-09-2007 | Исправлено: Elroir, 01:52 26-02-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gamebit73
    Исправленный код работает. Чтобы отправить сами лог-файлы на почту надо знать справку по zerat на русском. У меня её нет.

    Цитата:
    echo %%c > c:\backup\1.txt  
    это ошибка, будет  только один файл из списка.
     
     
    Добавлено:
    В шапке, в Полезные утилиты есть для работы с почтой.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 07:23 08-02-2008
    gamebit73

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Все равно не хочет...
    вот что выводит:

    Код:
     
    C:\backup>for /F "tokens=*" %c in ('dir f:\log\*.log /t:w /o:-d /a:-d /b') do (f
    or /F "tokens=1*" %d in ("%~tc") do (if "%d" == "08.02.2008" (echo %c  1>>c:\bac
    kup\1.txt )  else (
    C:\backup\zeratssl\zerat smtphost:boggk.ru from:niv@boggk.ru t
    o:niv1@boggk.ru subject:"Log" %PUT="C:\backup\1.txt"
     goto :eof
    ) ) )
     
    C:\backup>(for /F "tokens=1*" %d in ("") do (if "%d" == "08.02.2008" (echo ddoos
    boges.log  1>>c:\backup\1.txt )  else (
    C:\backup\zeratssl\zerat smtphost:boggk.ru from:niv@boggk.ru t
    o:niv1@boggk.ru subject:"Log" %PUT="C:\backup\1.txt"
     goto :eof
    ) ) )
     

    Может он не может сравнить даты из-за неправильных форматов?

    Всего записей: 6 | Зарегистр. 08-02-2008 | Отправлено: 08:26 08-02-2008
    Ilyansk

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    хотел поместить в шапку в раздел "работа с датой...", а попало сюда :/
    батник расчета длительности процессов  
    Может кому интересно, батник расчета длительности процессов, выдающий результат на экран в виде часов минут секунд. Десятые доли секунд не учитывет. Работает - если время окончания (HH:MM:SS[.DD]) БОЛЬШЕ времени начала. У себя использую для расчета времени создания резервной копии. Батник копии стартует в 0:10 и первой строкой пишет время в файл _start.txt (%time% > _start.txt), по окончании соответственно в _finish.txt    Есть еще батник проверки результатов (сравнивает даты и пр.), туда и встроены строки

    Код:
    for /f "tokens=2 delims= "  %%Q in (f:\archive\_start.txt,f:\archive\_finish.txt) do call :coll %%Q
    call calc_time !t1! !t2!
    goto :eof
    :coll
    set /a i+=1 & set t!i!=%1
    goto :eof

    ну и сам  calc_time.bat (код дополнен (выводит текстовую часть сообщения, заданного пользователем) и отлажен, согласно замечанию уважаемого wolf0425, которое последует после )
    пример вызова  
       calc_time 13:26:06.23 18:01:06.76  На всё-про всё ушло
    выдаст:
    На всё-про всё ушло 4 ч. 35 мин.  Свой текст можно опустить. По умолчанию сообощение "Процесс длился около N час. М мин. С сек."
    поместив пост, увидел некоторое излишество кода и поправил. В итоге в строке set /a SEC%1=%2 * 3600+%3 * 60+%4 у 3600 случайно удалил один ноль и получилось 360, что и приводило к ошбкам в расчетах. Прошу прощения у сообщества

    Код:
    @echo off
    setlocal enabledelayedexpansion  
    if "%1" == ""  goto :nopars
    set t1=%1 & set t2=%2
    :aga
    if "%3"=="" (goto :nx) else (
    set msg=!msg! %3
    shift
    goto :aga
    )  
    :nx
    for /L %%I in (1,1,2) do call :razb %%I
    goto :nxt
    :razb
    for /f "tokens=1,2,3,4 delims=:." %%T in ("!t%1!") do call :msec %1 %%T %%U %%V
    goto :eof
    :msec
    set /a sec%1=%2 * 3600 + %3 * 60 + %4  
    goto :eof
    :nxt
    set /a diff=SEC2-SEC1
    set "ch=0" & set "och=0" & set "min=0" & set "omin=0" & set "ss=0"
    set /a ch=diff/3600 & set /a och=diff-(ch*3600)
    set /a min=och/60 & set /a ss=och-(min*60)
    if !ch! gtr 0 (set "out=!ch! ч.")
    if !min! gtr 0 (set "out=!out! !min! мин.")
    if !ss! gtr 0 (set "out=!out! !ss! сек.")
    if not defined msg (echo Процесс длился около !out!
    ) else (
    echo !msg! !out!
    )
    goto :fin
    :nopars
    echo Usage: calc_time start_time finish_time [message's words]
    echo    format for times:   HH:MM:SS[.DD]    
    echo Finish time must be greater start
    ping -w 2000 127.0.0.1 > nul
    :fin

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 10:28 08-02-2008 | Исправлено: Ilyansk, 06:32 06-03-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gamebit73
    for %%c in ("любой файл") do echo %%~tc
    что выдаёт?
     
    попробуй ещё раз мой вариант без изменений, заменив только пути.
    Также помогает
     
    chcp 1251 > nul
     
    на второй строчке

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 11:05 08-02-2008 | Исправлено: king_stiven, 11:14 08-02-2008
    Joolz

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Упрощу задачу.
    Есть файл вида:

    MS Office 2003
    Acrobat Reader 5.0
    Opera 8.5
    Windows Installer 3.1
    Opera 8.5
    Adobe InDesign CS3
    MS Office XP
    MS Office XP
    Opera 9.02
    Acrobat reader 5.0
    MS Offise 2003
    Total Commander
    Opera 8.5
    Adobe InDesign CS3

     
    Нужно из него получить файл вида:

    MS Office 2003            - 2
    Acrobat Reader 5.0      - 2
    Opera 8.5                   - 3
    Windows Installer 3.1   -1
    Adobe InDesign CS3     -2
    MS Office XP                -2
    Opera 9.02                   -1
    Total Commander         -1

    Где правый столбик - это количество повторений идентичных строчек из первого файла.
     
    Понимаю что все очень просто но как-то не получается у меня.

    Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 11:07 08-02-2008 | Исправлено: Joolz, 11:08 08-02-2008
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    интересно, народ когда-нибудь научится элементарно тестировать свои выкладываемые батники или хотя бы писать их без очевидных ошибок?
     
    Ilyansk, calc_time.bat 08:08:08 09:09:09 должен не падать,  
    а calc_time.bat 18:18:18 19:19:19 должен выдавать время в 1 час с копейками -  а не 7минут 1сек, как сейчас...
     
    правильно секунды вычисляются например так:
    Код:
    :msec
    set /a SEC%1=1%2 * 3600 + 1%3 * 60 + 1%4 - 366100
    goto :eof


    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:29 08-02-2008 | Исправлено: wolf0425, 11:40 08-02-2008
    king_stiven

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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    for /f "usebackq tokens=*" %%c in ("1.txt") do (
        for /f "usebackq tokens=*" %%d in ("2.txt") do (
            if "%%c"=="%%d" set povtor=yes
        )
        if not defined povtor (
            set "program=%%c"
            echo %%c>>2.txt
            call :spisok
        )
        set povtor=
    )
    goto :eof
    :spisok
    for /f "usebackq tokens=*" %%e in ("1.txt") do if "%%e"=="%program%" set /a count+=1
    echo %program%                   -!count!>>3.txt
    set count=

     
    1.txt  где ищем
    2.txt   временный
    3.txt результат

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 12:30 08-02-2008 | Исправлено: king_stiven, 09:04 11-02-2008
    timex

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем!
     
    Реальная задача для программиста.  
    Часть её, основывающаяся на bat-скрипте, описывается так.
     
    Существует какой-то файл (например ver.h или version.h), следующего содержания:

    Код:
     
    /*
    любое колисчество строк
    */
    // любое количество таких строк (начинающихся с "//")
    #define build_number 1
     

    (между "build_number" и числом может быть либо несколько пробелов, либо символы табуляции)
     
    bat-файл должен суметь увеличить число, стоящее за фразой "build_number" на 1 и перезаписать этот файл с увеличенным числом.
     
    Буду благодарен за подсказки по решению!

    Всего записей: 44 | Зарегистр. 26-12-2005 | Отправлено: 12:42 08-02-2008 | Исправлено: timex, 12:45 08-02-2008
    Joolz

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Спасибо!
    На приведенном здесь фрагменте отработал отлично, на более длинном списке начал затыкаться. Замена %program% на !program! помогла.

    Всего записей: 100 | Зарегистр. 24-01-2008 | Отправлено: 12:59 08-02-2008
    Ilyansk

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ой-ой-ой!!!! полного тестирования не провел
    прошу прощения...
    а можно свои посты изымать? аж стыдно ...

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 14:07 08-02-2008
    Grim_Repo



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    сорри за но я не нашел тему где можно задать данный вопрос:
    запустится ли *.bat файл с помощью autorun.ini с CD. Код такой:
    Код:
    [autorun]
    OPEN=start.bat
    ICON=desktop.ico
    - кстати, а можно ли обойтись без параметра ICON?
     
    P.S.
    Скажите, а autorun для флешки должен быть ТОЛЬКО с разрешением inf, или же ini тоже будет работать с флешкой? И запустится ли с помощью autorun.ini/inf - bat файл с флешки? И для файла autorun.inf синтаксис такой же как и для ini?
     
    P.P.S.
    И еще вопрос на счет утилиты (hstart) у нее такой синтаксис
    Код:
    /nowindow "your.cmd"
    это значит что нужно в "" вписывать путь к файлу CMD тоесть bat не поддерживается? И еще последний вопрос, если, например, нужно чтоб батник скопировал просто в %windir% то не нужно ставить \ в конце - %windir%\ ?
     
     
    Заранее, огромное спасибо!

    Всего записей: 397 | Зарегистр. 02-05-2006 | Отправлено: 14:52 08-02-2008 | Исправлено: Grim_Repo, 15:37 08-02-2008
    01MDM



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

    Код:
     
    @echo off
    setlocal
     
    set build=# define build_number
    for /f "tokens=1-4" %%1 in ('type ver.h ^| findstr /c:"%build%"') do (
        set num=%%4
        set "build=%build% %%4"
        set "newbuild=%%1 %%2 %%3"    
    )
    set /a num+=1
     
    gsar -s"%build%" -r"%newbuild% %num%" ver.h new_ver.h
     
    :: или если перезаписать исходный файл  
    gsar -s"%build%" -r"%newbuild% %num%" -o ver.h
     

     
    gsar, что бы не заморачиваться с форматированием  
     
     
    Добавлено:
    Grim_Repo
    Open в autoun.inf на флешке работать не будет.
    На остальные вопросы ты и сам можешь найти ответы, если просто попробуешь.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 15:24 08-02-2008 | Исправлено: 01MDM, 16:28 08-02-2008
    gamebit73

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

    Цитата:
    for %%c in ("любой файл") do echo %%~tc
    что выдаёт?  

    C:\backup>for %c in ("1.txt") do echo %~tc
    C:\backup>echo 11.02.2008 08:57
    11.02.2008 08:57

    Всего записей: 6 | Зарегистр. 08-02-2008 | Отправлено: 05:15 11-02-2008 | Исправлено: gamebit73, 05:30 11-02-2008
    Ilyansk

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

    Цитата:
    Grim_Repo  
    Open в autoun.inf на флешке работать не будет.

     
    а что будет, только вирусы?

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 06:54 11-02-2008
    batniki



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста решить след. задачу:
    Нужно проверить на компе определенный порт если он занят - то открыть программу 1, если свободен то открыть программу 2.

    Всего записей: 50 | Зарегистр. 11-02-2008 | Отправлено: 07:36 11-02-2008
    01MDM



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

    Цитата:
    а что будет, только вирусы?

    Не понял вопроса?  
    Пункт Open=program.exe в autorun.inf на usb-flash работать не будет. Как запускаются вирусы не знаю, наверное через Shell/command

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 08:09 11-02-2008 | Исправлено: 01MDM, 08:45 11-02-2008
    king_stiven

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

    Код:
    @echo off  
    for /f "usebackq tokens=*" %%c in (`dir "E:\split 1\*.log" /t:w /o:-d /a:-d /b`) do (  
        for /f "tokens=1*" %%d in ("%%~tc") do (  
            if "%%d"=="%date%" (  
                echo E:\split 1\%%c>> 1.txt
                set Mail=yes
            ) else (
                if defined Mail сюда написать команду для отправкам списка из 1.txt по e-mail
                if not defined Mail echo файлов для почты нет!
                goto :eof  
            )  
        )  
    )  

    Ничего не меняй кроме путей.
     
    Добавлено:

    Цитата:
    Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!  


    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 08:32 11-02-2008 | Исправлено: king_stiven, 08:48 11-02-2008
    Elroir



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

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 10:41 11-02-2008
    Ilyansk

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    01MDM,
    извините - эмоции. Grim_Repo поинтересовался можно ли автоматом запустить батник с флэшки и, как выяснилось - достуного и легкого пути нет, тем не менее вирусы победно шествуют широкими шагами посредством флэшек, великолепно с них запускаяясь без ведома вставляющего... А ведь заманчиво написать синхронизационный батник (у меня, кстати, такой готов) и не париться с его запуском при вставке флэшки для перекрестного обновления данных, что у меня так и не получилось.
    Я просто надеялся, что Вы более меня просвещены не толко в вопросах написания батников, но и в способах их запуска. Извините за офф-топ и флейм

    Всего записей: 70 | Зарегистр. 27-07-2006 | Отправлено: 11:47 11-02-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ilyansk
    Если честно, то я не знаю как автоматом запустить какую-нибудь программу или скрипт с флешки  стандартным способом при ее монтировании. Я искал подобную информацию, но ничего не нашел.. Если ее открывать даблкликом то здесь все просто, а вот при ее присоединении.. хз  
     
    Это скорее в раздел для программистов, и решается на другом уровне взаимодействия с os.  

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 12:12 11-02-2008
       

    Страницы: 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 100 101 102 103

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 4
    evle (19-03-2008 19:44): Лимит страниц.
    Задачи на bat-файлах 5


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru