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

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

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

vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117

   

vu1tur



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

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:37 26-05-2009 | Исправлено: TechnicsKuzya, 13:53 27-12-2009
    svobodny



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Через батник запускаю 2 программы, первая необходима для работы второй. Когда поработал и закрываю вторую, первая соответственно висит в процессах. Приходится ее тоже закрывать ручками.
     
    Можно ли как-то следить за процессом второй программы и после ее закрытия закрывать первую? Для этого батник по-идее не должен закрываться после запуска прог?..
     
    Подскажите, пожалуйста.

    Всего записей: 583 | Зарегистр. 14-02-2009 | Отправлено: 07:43 19-01-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    svobodny
    Парсить вывод команды tasklist через определённые промежутки и затем по необходимости:
     
    Taskkill /F /IM Program.exe

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 10:06 19-01-2010 | Исправлено: king_stiven, 10:10 19-01-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    можно как-то обойти проблему с ошибкой findstr:  ??
     
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 125.  
    FINDSTR: Слишком длинная строка 286.  
    FINDSTR: Слишком длинная строка 287.  
     
    и еще не пойму с выводом (не все строки, нет, например, № 47 и 49, хотя нет и ошибки - FINDSTR: Слишком длинная строка 47 или 49 )
     Подробнее...
     

    Код:
    mode con lines=6000  
    cd\  
     
    for /f "tokens=*" %%i in ('reg query "hklm\hardware" /s ^|findstr /i /n "HKEY_LOCAL_MACHINE\hardware VideoBiosDate"') do call:_1 "%%i"  
    for /f "skip=%skip1% tokens=*" %%i in ('reg query "hklm\hardware" /s ^|findstr /i "HKEY_LOCAL_MACHINE\hardware VideoBiosDate"') do call:_2 "%%i"  
    goto:eof  
     
    :next1  
    echo _%var%_  
    pause  
     
    :_1  
    echo %~1|find /i "VideoBiosDate" &&for /f "tokens=1 delims=:" %%a in ('echo %~1') do set "skip1=%%a"  
    goto:eof  
     
    :_2  
    echo %~1|find /i "HKEY_LOCAL_MACHINE\hardware" &&(set "var=%~1" &goto:next1)  
    goto:eof

     


     
    Добавлено:
    нет, это выше моего понимания -   Подробнее...
    все, разобрался, вопрос снят, но задачу пока не решил (как выдрать строку № 48) - будем ставить counter


     
    Добавлено:
    svobodny
    все зависит от конкретики - какие проги, как они коррелируются и какой код их запуска в батнике
    p.s.
    может можно использовать ключ /t  
    Задает завершение всех дочерних процессов вместе с родительским, такое действие обычно известно как уничтожение дерева.  

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 10:55 19-01-2010 | Исправлено: mugil_cephalus, 13:48 19-01-2010
    Kirillhome



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

    Цитата:
    Да, это надо сделать на нескольких компах!Что Вы подразумеваете под понятием "Автоматизация"?

    Именно это и подразумеваю - сделать однотипное действие на нескольких компьютерах (или - с некоторой регулярностью и т.п.)
     

    Цитата:
    какую прогу посоветуете использовать вместо стд. планировщика,желательно компактную

    А зачем? Чем не устраивает "планировщик задач"???

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 13:09 19-01-2010
    wolf0425



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

    Цитата:
    и где строки № 5, 7 и другие "недостающие" (см. первый листинг) ??  
    ты выведи этот текст сначала в файл, и посмотри - чего там на 5,7,48 и прочих странных строках. скорее всего 5,7 пустые - таких много в листинге reg query "hklm\hardware" /s >file.txt
     
    а еще можешь попробовать использовать find a не findstr - у них разные ограничения на текст.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:43 19-01-2010 | Исправлено: wolf0425, 13:47 19-01-2010
    Kirillhome



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

    Код:
     
    @echo off
    for /f "tokens=*" %%i in ('reg query "hklm\hardware" /s ^|findstr /i /n VideoBiosDate 2^>nul') do @echo "%%i"
     

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 13:47 19-01-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Kirillhome
    вот пропавшие строки:
    F:\>reg query "hklm\hardware" /s |more
     
    HKEY_LOCAL_MACHINE\hardware\ACPI\DSDT\INTELR\AWRDACPI\00001000
        00000000    REG_BINARY      44534454124200000162494E54454C524157524441435049001000004D5346540E000001102C5C5F50525F5B83115C2E5F50525F435055300
    000000000005B83115C2E5F50525F43505531010000000000085C5F53305F120A040A000A000A000A00085C5F53315F120A040A010A000A000A00085C5353335F120A040A050A000A
    000A00085C5F53345F120A040A060A000A000A00085C5F53355F120A040A070A000A000A0008464C41470A0008535441540A005B805C44454247010A800A015B810C5C44454247014
    4424731085B804558544D000C30F80F000A105B81294558544D02524F4D3110524D533110524F4D3210524D533210524F4D3310524D533310414D454D205B805C534D4943010AB20A
     
    Kirillhome
    про  
    Цитата:
    2^>nul'
    тоже думал, но, судя по всему stderr тоже выводиться - так как  
    FINDSTR: Слишком длинная строка 15.  
    FINDSTR: Слишком длинная строка 125.  
    FINDSTR: Слишком длинная строка 286
     
    p.s.
    поставлю счетчик на stdout и stderr
     
    p.p.s.
    вообще, - задача заказчика - найти в корневом разделе HKEY_LOCAL_MACHINE\SYSTEM и далее в любом вложенном в него подразделе, подраздел с неизвестным именем, но с известным параметром - D3DOGL_70835937 (и потом поменять значение этого параметра)

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 13:51 19-01-2010 | Исправлено: mugil_cephalus, 13:54 19-01-2010
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    mugil_cephalus - ну тогда, как подсказал wolf0425 - не FindStr, а Find
     

    Код:
     
    @echo off
    for /f "tokens=*" %%i in ('reg query "hklm\hardware" /s ^|find /i /n "VideoBiosDate"') do @echo "%%i"
     

     
     
    добавка :)
    В данном случае - проблема такая - FindStr на самом деле ищет очевидно всюду, но выведет НЕ ПОЛНУЮ СТРОКУ.
    Т.е. если взять в качестве строки поиска несколько завершающих символов 15-й строки, и сделать так

    Код:
     
    reg query hklm\hardware /s | findstr /i /n "268140657414B5F01" 2>nul
     

     
    То у меня на выходе было следующее:
    15:_Последние_1812_символов_15-й_строки
     
    (полностью 15 строка содержит 26'396 символов)
    Если же взять в качествен строки поиска несколько стартовых символов 15-й строки, и сделать так

    Код:
     
    reg query hklm\hardware /s | findstr /i /n "445344547E33000001EE31414" 2>nul
     

    То на выходе пусто.
     
    Если же мы сначала импортируем реестр в файл, а только потом будем в нём искать - то поиск пройдёт:
    а) без ошибок о длинных строках
    б) вне зависимости от того, какую часть (начальную, или конечную) длиной строки мы укажем - она будет найдена  
     
    т.е. примерно так:

    Код:
     
    reg query hklm\hardware /s > all_rgq.txt
    findstr /i /n "445344547E33000001EE31414" all_rgq.txt 2>nul 1>otvet.txt
     

    в файле otvet.txt будет целиком и полностью 15-я строка. Точнее будет так
    15:И_здесь_все_26'396_символов_15-й_строки
     
     
    Если же мы будем использовать вместо FindStr просто Find, то она не будет ругаться на длинные строи, но и в конце длинной строки искать не будет.
    т.е. вот это сработает (поиск по начальным символам).

    Код:
     
    reg query hklm\hardware /s > all_rgq.txt
    findstr /i /n "445344547E33000001EE31414" all_rgq.txt 2>nul
     

    Но на выходе - строка разером 1030 байт
     
    а вот это (поиск по конечным)

    Код:
     
    reg query hklm\hardware /s > all_rgq.txt
    findstr /i /n "268140657414B5F01" all_rgq.txt 2>nul
     

    не даст результата.

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 13:56 19-01-2010 | Исправлено: Kirillhome, 14:38 19-01-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    а вообще странно что findstr спотыкается на строках всего в 512+ символов, я думал предел больше.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:03 19-01-2010 | Исправлено: wolf0425, 14:05 19-01-2010
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Kirillhome
    wolf0425
    то ли плохо я прочитал мануал, то ли не знаю, но, find может так же , как и findstr искать ??  :  
    Для поиска слова "hello" или "there" в файле x.y введите следующую каманду:
     
    findstr "hello there" x.y
     
    мне нужно найти - findstr /i /n "HKEY_LOCAL_MACHINE\hardware VideoBiosDate", то есть или - HKEY_LOCAL_MACHINE\hardware  или - VideoBiosDate

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 14:08 19-01-2010 | Исправлено: mugil_cephalus, 14:09 19-01-2010
    GlebisZ



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, спасайте. Нужно ежедневно отправлять бух итоги по почте. Юзвери делать это вручную через Outlook Exp и MS Outlook (даже по Отправить-адресат) не хотят и сваливают на меня. мне нужно сделать "картинку на экране", при нажатии на который появляется почтовый клиент по умолчанию с уже введённым адресатом, темой и прикреплённым отчётом. Что бы пользователю нужно было только изменить дату отчёта в теме и нажать кнопку отправить. Перерыскал весь инет и руборд, перепробывал следующие реализации:
    1) бланк Out Exp не подходит - файл должен быть разный каждый раз последней версии.  
    2) ярлык mailto:mail@mail.ru?atach=C:\filetosent.zip&subject=19.01.2010 - никак не поддерживает mapi функцию attach.  
    3) параметры запуска MS Outlook  
    "...Outlook.exe" /m mail@mail.ru /a "C:\filetosent.zip"  
    совместно не работает, либо указывать аттач, либо адресата. Как указать тему вообще в хелпе не нашёл.  
    4) сторонние утилиты posti и т.д. крайне не желательны. Сторонние почтовые программы (как the Bat!) вообще запрещенны. Exchenge сервера нет и не будет в помине.  
    5) все найденные реализации на vbs просто автоматом отправляют письма, и "не видно что точно отправилось".
    6) нашёл исходники для VB на SimpleMAPI и MAPI,  
    _http://nrd.pnpi.spb.ru/UseSoft/Journals/Soft&Script/ssm069/comprice-mail.html
    но в программировании я не силён.
     
    Вот направили меня сюда. До того как я полностью допру до понимания MAPI, VB и VBS, я отправлю не одну сотню отчётов и ни разу не свалю домой пораньше.

    Всего записей: 4 | Зарегистр. 13-07-2008 | Отправлено: 14:18 19-01-2010 | Исправлено: GlebisZ, 14:27 19-01-2010
    wolf0425



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

    Цитата:
    то есть или - HKEY_LOCAL_MACHINE\hardware  или - VideoBiosDate

    а, ну значит мы тормозим на пару.  
    Ну еще можно использовать sed вместо find
    Код:
    for /f "tokens=*" %%i in ('reg query "hklm\hardware" /s ^|sed -r -n "s/^.*HKEY_LOCAL_MACHINE\\hardware|VideoBiosDate.*$/\0/gpi"') do @echo "%%i"

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:24 19-01-2010
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    mugil_cephalus
    Во первых - посмотри добавку в моём предыдущем сообщении, во-вторых - т.к. мы уже ищем в кусте HKLM\hardware (см. reg query в твоей задаче) - то зачем дополнительно искать HKEY_LOCAL_MACHINE\hardware???

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 14:42 19-01-2010
    mugil_cephalus

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

    Цитата:
    Во первых - посмотри добавку в моём предыдущем сообщении,

    да, спасибо,

    Цитата:
    во-вторых - т.к. мы уже ищем в кусте HKLM\hardware (см. reg query в твоей задаче) - то зачем дополнительно искать HKEY_LOCAL_MACHINE\hardware???

    потому что:
    F:\>for /f "tokens=*" %i in ('reg query "hklm\hardware" /s ^|findstr /i /n "VideoBiosDate"') do @echo "%i"
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 15.
    FINDSTR: Слишком длинная строка 125.
    FINDSTR: Слишком длинная строка 286.
    FINDSTR: Слишком длинная строка 287.
    "46:    VideoBiosDate   REG_SZ  04/11/02"
     
    F:\>
    а мне потом еще в этом же выводе нужно будет найти раздел для параметра "VideoBiosDate"
     
     
    p.s.
    пока есть идея  - буду ее развивать (ошибки оставлю на потом, может этот параметр сидит не в длинном разделе и ошибки не помешают)

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 15:00 19-01-2010 | Исправлено: mugil_cephalus, 15:05 19-01-2010
    TarValon

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста.
    Есть архив, в нем 2 файла:
    - DBF
    - Файл, в котором записана разная информация а так же дата, когда этот дбфник нужно обработать
     
    стоит задача разархивировать архив, сравнить дату в файле с текущей, и если дата совпадает, обработать.
    Все работает. А вот как даты сравнивать, не допру никак.
     

    Всего записей: 24 | Зарегистр. 18-12-2008 | Отправлено: 15:16 19-01-2010
    wolf0425



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

    Цитата:
    А вот как даты сравнивать, не допру никак.  
    курить for /? относительно %~ti

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 15:22 19-01-2010
    mugil_cephalus

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

    Код:
    mode con lines=6000
    cd\
     
    for /f "tokens=*" %%i in ('reg query "hklm\hardware" /s ^|findstr /i "HKEY_LOCAL_MACHINE\hardware VideoBiosDate"') do call:_1 "%%i"
    goto:eof
     
    :next1
    echo _%var1%_
    pause
     
    :_1
    echo %~1|find /i "HKEY_LOCAL_MACHINE\hardware" &&set "var1=%~1"
    echo %~1|find /i "VideoBiosDate" &&goto:next1
    goto:eof

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 15:23 19-01-2010
    svobodny



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

    Цитата:
    все зависит от конкретики - какие проги, как они коррелируются и какой код их запуска в батнике

    Проги - Firefox Builder Optimization и Firefox 3.7 alpha 1. Запускаются просто через start. Может можно как-то хитрее запустить, но я не знаю.

    Всего записей: 583 | Зарегистр. 14-02-2009 | Отправлено: 16:40 19-01-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    svobodny  а что - FBO так часто запускаешь, что батник нужен?
    как-то так:
     

    Код:
    start "" program1.exe
    cmdow.exe @ /hid
    start "" /wait program2.exe
    taskkill.exe /f /t /im program1.exe
    exit

     
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 17:00 19-01-2010 | Исправлено: wolf0425, 17:00 19-01-2010
    svobodny



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Запускает обе проги. После закрытия ФФ, сам батник закрывается, но вторая прога - нет.
     
    Еще пишет следующее:

    Цитата:
    "cmdow.exe" не является внутренней или внешней
    командой, исполняемой программой или пакетным файлом.

     
     
    Добавлено:
    А нет. Наврал. Вторая прога тоже закрывается.
     
    Вопрос остался на счет надписи. И как можно скрыть батник, а то висит на виду...

    Всего записей: 583 | Зарегистр. 14-02-2009 | Отправлено: 17:12 19-01-2010
       

    Страницы: 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 7
    vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru