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

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

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

vu1tur (09-01-2011 11:53): лимит страниц, продолжение — http://forum.ru-board.com/topic.cgi?forum=62&topic=22143  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 17:45 04-09-2010 | Исправлено: Accessor, 18:04 28-09-2010
    wolf0425



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

    Цитата:
    но мне сам принцип внутри цикла интересен.  
    ошибок аж две:
    для переменной типа %%i не работает обрезание по длине и прочие прелести :~
    внутри цикла echo %curdir% работает не так как тебе бы хотелось - значение %curdir% подставляется то, что было до старта цикла. поэтому смотри пример выше по странице с SetLocal enabledelayedexpansion  и  echo !ti:%msc%=!  
     

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 10:17 13-10-2010
    Maximus777

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

    Цитата:
    Надо предварительно присвоить переменной, а затем уже вырезать куски из нее.

    Спасибо. Работает!

    Всего записей: 673 | Зарегистр. 27-07-2007 | Отправлено: 10:21 13-10-2010
    SANIOK_AV



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

    Цитата:
    Код:  
    @echo off  
    setlocal  
    1>nul chcp 1251  
     
    set "regroot=HKLM\SYSTEM\CurrentControlSet\Control\Network\{4D36E972-E325-11CE-BFC1-08002BE10318}"  
     
    for /f "tokens=3*" %%i in ('reg query "%regroot%" /s ^| findstr "Name"') do echo %%i %%j  
     
    1>nul chcp 866  
     

    Подскажите пожалуйста как работают конструкции

    Код:
    1>nul chcp 1251

    и

    Код:
    1>nul chcp 866  

    ?

    Всего записей: 485 | Зарегистр. 31-03-2009 | Отправлено: 10:24 13-10-2010
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    SetLocal enabledelayedexpansion  и  echo !ti:%msc%=!

    Объясните плиз на пальцах, что происходит в ti:%msc%= ?

    Всего записей: 673 | Зарегистр. 27-07-2007 | Отправлено: 10:29 13-10-2010
    king_stiven

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

    Цитата:
    setlocal enabledelayedexpansion и переменные окружения

    А также запустить батник без
    @echo off  
    и с  
    pause
    в конце батника и смотреть, думать.
    Также
    set /?
    там всё понятно

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 10:47 13-10-2010 | Исправлено: king_stiven, 10:49 13-10-2010
    Maximus777

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

    Код:
    E:\distr\Utils>attrib
    Не найден файл: E:\distr\Utils\*.*

    Как отловить эти самые *.* ? Это и будет означать, что файлов в папке нет.

    Всего записей: 673 | Зарегистр. 27-07-2007 | Отправлено: 10:47 13-10-2010
    01MDM



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

    Цитата:
     
    Подскажите пожалуйста как работают конструкции
     
    1>nul chcp 1251
     

    Ты берешь значения из реестра, которые в виндовой кодировке (cp1251), а консоль в OEM-кодировке (cp866). Для нормального отображения кириллических названий в консоли используется команда 'chcp 1251', "1>nul" подавляет служебный вывод этой команды.
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 10:50 13-10-2010
    Maximus777

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

    Цитата:
    А также запустить батник без  
    @echo off    
    и с  
    pause  
    в конце батника и смотреть, думать.

    Не помогает. Сделал даже так:

    Код:
    for /R %%i in (*.*) do (  
        Set ti=%%i
        echo %%i  
        echo !ti:%msc%=!

    Строки просто дублируются и всё. Просто в двух словах скажите, что там такое делается. Именно в !ti:%msc%=!

    Всего записей: 673 | Зарегистр. 27-07-2007 | Отправлено: 10:52 13-10-2010 | Исправлено: Maximus777, 10:54 13-10-2010
    king_stiven

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

    Код:
    SetLocal enabledelayedexpansion  
    for /R %%i in (*.*) do (
        Set ti=%%i
        1>>1.txt echo !ti:%cd%\=!
    )

    когда воск знаки и SetLocal enabledelayedexpansion, то подставляется значение переменной в самый последний момент а не сразу же, что было бы используй % вместо !
     
     
    Добавлено:

    Цитата:
    Строки просто дублируются

    запусти мой батник и смотри 1.txt, команда echo   в данном случае не корректно отображает, а батник будет работать. Если же тебе надо именно на экране увидеть. то существует пара способов.
     
    Добавлено:
    в !ti:%msc%=! вместо %msc% подставляется значение переменной msc, а вместо ti подставляется значение %%i

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 11:11 13-10-2010
    wolf0425



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

    Цитата:
    Строки просто дублируются и всё. Просто в двух словах скажите, что там такое делается. Именно в !ti:%msc%=!
    чтение set /? не помогло?
     в echo !ti:%msc%=! - печатается значение переменной ti, получающееся после удаления (замены на ничто) из неё подстроки равной значению %msc%

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 11:27 13-10-2010 | Исправлено: wolf0425, 11:28 13-10-2010
    Maximus777

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Цитата:
    запусти мой батник и смотри 1.txt

    Всё. Понял.
     
    Добавлено:
    wolf0425
    Цитата:
    в echo !ti:%msc%=! - печатается значение переменной ti, получающееся после удаления (замены на ничто) из неё подстроки равной значению %msc%

    Вот это мне и хотелось узнать. Спасибо. В справке непонятно было как получить такой эффект.

    Всего записей: 673 | Зарегистр. 27-07-2007 | Отправлено: 11:36 13-10-2010
    GORA2



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

    Цитата:
    Код от GORA2 у меня сработал не так, как мне надо

    Извиняюсь, еще раз перечитал условия, поправил ниже, хотя это уже написал king_stiven.
     
    01MDM

    Цитата:
    Вариант не совсем надежен, не будет корректно работать если в названии будет "!"

    Согласен. Но в путях\названиях могут встречаться не только "!", а и другие спец символы, как то "%", "(", ")" и т.д. Задачу не всегда можно решить... Я считаю, что применение спец. символов в путях - моветон. Мне довелось разбираться с неработающим батником который запускался в системной временной папке, а папка у пользователя была: C:\Windows\%Temp%\
    Вот и попробуй предусмотреть такой вариант!
     
    А конкретно по "!" и если речь идет только о выводе списка в консоль, то можно и так:
    Код:
    @echo off
    for /R %%i in (*.*) do (
        Set ti=%%i
        Call echo %%ti:%CD%\=%%
    )
    Pause
     

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 12:23 13-10-2010 | Исправлено: GORA2, 12:53 13-10-2010
    SANIOK_AV



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

    Цитата:
    Ты берешь значения из реестра, которые в виндовой кодировке (cp1251), а консоль в OEM-кодировке (cp866). Для нормального отображения кириллических названий в консоли используется команда 'chcp 1251', "1>nul" подавляет служебный вывод этой команды.  

    Спасибо большое!!!

    Всего записей: 485 | Зарегистр. 31-03-2009 | Отправлено: 13:38 13-10-2010
    Inside13

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Хелп) Программа проверяет подпись файлов из списка srv_log.txt  

    Код:
    @Echo Off
    del srv_log.txt
    eventcreate /L Application /T INFORMATION /SO Sigcheck /ID 747 /D "Sigcheck started"
    For /F %%A In (sclst.txt) Do sigcheck -q -u %%A>>srv_log.txt
    For /F %%i in (srv_log.txt) Do eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "%%i"

    Как дописать, чтобы в переменную %%i (eventcreate) заносились только к примеру строка   c:\windows\system32\MFC71.DLL или "No matching Files"
    Содержание файла srv_log.txt

    Код:
    c:\windows\system32\MFC71.DLL:
        Verified:    Unsigned
        File date:    20:39 21.03.2007
        Publisher:    Microsoft Corporation
        Description:    MFCDLL Shared Library - Retail Version
        Product:    Microsoft® Visual Studio .NET
        Version:    7.10.6041.0
        File version:    7.10.6041.0
    No matching files were found.
     
    No matching files were found.
     
     

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 15:44 13-10-2010 | Исправлено: Inside13, 15:46 13-10-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Inside13
    Если первую строку  то
                      ...
    For /F %%i in (srv_log.txt) do (
        eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "%%i"
        goto :eof
    )

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 15:57 13-10-2010 | Исправлено: king_stiven, 16:07 13-10-2010
    Inside13

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    2 king_stiven
    Сори, я немного не правильно вопрос поставил:

    Код:
    For /F %%i in (srv_log.txt) Do eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "%%i"
     
    создает по одному событию в системном журнале на каждую строку из файла srv_log, а нужно только события со строками "c:\windows\system32\*.DLL:" и "No matching files"
    К примеру для данного файла srv_log у меня должны создаться события:
    c:\windows\system32\MFC71.DLL:
    No matching files were found.
    No matching files were found.
    c:\windows\system32\MSXML4.DLL: (к примеру и тд)
    (а их в реале в этом файле намного больше)

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 16:15 13-10-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Inside13
    а пути к DLL какие в этом файле? Все в system32 ведут или есть еще куда?
    Или скажем у тебя там в путях только DLL файлы или могут быть разные?
    Короче, нужна строка для фильтрации, по которой можно было бы отделить зерна от плевел.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 16:24 13-10-2010
    Inside13

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    все файлы \system32\ и все, эти файлы из списка sclst.txt (только DLL и EXE)
    я пока накодил тут для "No matching files"

    Код:
    @Echo Off
    del srv_log.txt
    eventcreate /L Application /T INFORMATION /SO Sigcheck /ID 747 /D "Sigcheck started"
    For /F %%A In (sclst.txt) Do sigcheck -q -u %%A>>srv_log.txt
    For /F %%i in (srv_log.txt) Do (
    If "%%i"=="No" eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D "Not enough Files"
    )

    это конечно не важно, но он почему то считывает строку до пробела, из за этого сравнение "No", а не полностью

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 16:40 13-10-2010 | Исправлено: Inside13, 16:41 13-10-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Inside13
    For /F "tokens=* delims=" %%i in ('findstr /i "windows matching" ^<srv_log.txt') Do (
    eventcreate /L Application /T ERROR /SO Sigcheck /ID 747 /D %%i
    )

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 16:56 13-10-2010
    Inside13

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Спасибо, на тест файле работает, запустил уже почти рабочую версию ) думаю все ок будет
    еще раз сенкс, все работает норм)

    Всего записей: 6 | Зарегистр. 13-10-2010 | Отправлено: 17:08 13-10-2010 | Исправлено: Inside13, 17:29 13-10-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 9
    vu1tur (09-01-2011 11:53): лимит страниц, продолжение — http://forum.ru-board.com/topic.cgi?forum=62&topic=22143


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru