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

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

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

vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:53 09-01-2011 | Исправлено: mazafakermazafaka, 11:22 04-06-2011
    01MDM



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

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
     
    for /l %%i in (0,1,5) do (
     
        1>nul ping -n 3 localhost
        echo !time!
     
    )
     

     
     
    Добавлено:
    Alexey87

    Код:
     
    @echo off
    setlocal
     
    pushd "C:\Folder\where html"
    for %%i in (*.html) do (
     
        for /f "tokens=2 delims=<>" %%j in ('findstr /i "h3>.*</h" "%%i"') do echo %%j
     
    )
    popd
     

    При условии, что заголовок имеет вид "<h3>some title</h>"

    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 00:11 30-04-2011 | Исправлено: 01MDM, 00:29 30-04-2011
    Bezzz

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, сенькс.
    И снова в который раз убедился в том, что надо внимательней читать то, что выводит например

    Код:
    set /?

    Типа, если ничто не помогает, прочтите, наконец, инструкцию.
    :-D

    Всего записей: 1071 | Зарегистр. 14-04-2005 | Отправлено: 08:24 30-04-2011 | Исправлено: Bezzz, 08:25 30-04-2011
    NIKZZZZ



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

    Цитата:
    Выводимое время - одинаковое. Невзирая на 10 сек. задержки от пинг.  

     
    Хотя и операции, заключенные в скобки, выполняются последовательно, значение переменных (%Time%) не меняется для всего блока.
     
    Можно, например, так:

    Код:
    @echo off
    echo ! > !.txt
    for /f "tokens=1" %%i in (!.txt) do call :_1 %%i
    del /f /q !.txt
    goto :eof
     
    :_1
    echo %1 - %TIME%
    ping localhost -t -n 10 > nul
    echo %1 - %TIME%
    goto :eof

     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 11:47 30-04-2011
    Bezzz

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ, спасибо, но я воспользовался напоминанием, любезно предоставленным 01MDM
    Это setlocal enabledelayedexpansion
    и вместо %VAR% использовать !VAR!
    именно так написано в set /?, цитирую:
    Связывание времени выполнения для переменных среды окружения происходит при использовании специального символа (восклицательного знака), обозначающего проведение сопоставления во время выполнения. Если включена поддержка связывания времени выполнения, то для достижения ожидаемых результатов приведенные выше фрагменты должны быть изменены следующим образом...
    Вывод: инструкцию читать надо
     
    Кстати, припоминаю, что не в первый раз наступаю на эти грабли. Старость не радость :-D

    Всего записей: 1071 | Зарегистр. 14-04-2005 | Отправлено: 14:13 30-04-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bezzz
    На самом деле, если не нужен enabledelayedexpansion, а такие ситуации случаются, то все решается выносом из тела цикла, как подсказалNIKZZZZ, я обычно делаю именно так.
     


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:18 30-04-2011
    Bezzz

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, вынос уже используется, и весьма интенсивно. А время нужно чтобы знать сколько секунд выполняется каждый проход цикла. Анализировать дату последнего изменения файлов слишком утомительно )

    Всего записей: 1071 | Зарегистр. 14-04-2005 | Отправлено: 14:25 30-04-2011
    Alexey87

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, благодарю за помощь, но код не срабатывает.
    Заменил конструкцию "C:\Folder\where html" на "d:\html" (так как именно здесь лежат файлы)
    Большинство заголовков имеют вид <h1 id="fav_name_1" class="news_item_header">some title</h1>

    Всего записей: 657 | Зарегистр. 27-01-2008 | Отправлено: 20:27 30-04-2011 | Исправлено: Alexey87, 20:28 30-04-2011
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    > "<h3>some title</h>"
    Такого вида быть не может — у вас открывающий и закрывающий тэг разные. ;)

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 20:41 30-04-2011
    01MDM



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

    Цитата:
    Такого вида быть не может — у вас открывающий и закрывающий тэг разные.

    В смысле </h3> ? Да уж, не вебмастер =)
    Alexey87

    Цитата:
    Большинство заголовков имеют вид <h1 id="fav_name_1" class="news_item_header">some title</h1>

    Ключевое слово "большинство". Тогда либо sed и регэкспы, так как виндовый findstr очень ограничен в плане поиска по рег. выражениям, либо все заголовки одинаковые. В вашем случае это должно выглядеть где-то так:

    Код:
     
    ....
    for /f "tokens=2 delims=<>" %%j in ('findstr /i "h1.*>.*</h1" "%%i"') do echo %%j  
    .....
     

     


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:47 30-04-2011 | Исправлено: 01MDM, 22:54 30-04-2011
    Free_Soft



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пардон за небольшой оффтоп, кто знает, где в реестре Win7 хранится содержимое Панели управления? конкретно, нужно оттуда удалить Защитника Windows

    ----------
    На вашей перфокартѣ обнаруженъ вирусъ, механизмъ будетъ остановленъ.

    Всего записей: 1536 | Зарегистр. 19-04-2010 | Отправлено: 23:28 30-04-2011
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    > findstr очень ограничен в плане поиска по рег. выражениям
    Т.е. такая штука не прокатит:
    "h[1-6].*>.*</h[1-6]"
    ?
     
    Сед выборку субстрок из строки (как ни странно) делать не умеет.
    Разумеется можно Авком, но для столь простой задачи идеально подойдет и grep, у которого есть ключ -o:
     
    $ grep -o '<h[1-6][^>]*>[^<]*</h[1-6]>' file.html

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 23:57 30-04-2011 | Исправлено: ASE_DAG, 23:58 30-04-2011
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ASE_DAG
    Прокатит. Но если есть всякие вложенные теги и все это без какой-то системы, то тут два выхода -- либо выдергивать с помощью sed определенный адрес ( \1 к примеру ) или считать токены в цикле for
    Что-нибудь а-ля:

    Код:
     
    sed -n "s/<h[1-6].*>\(.*\)<h[1-6]>/\1/"
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 00:15 01-05-2011 | Исправлено: 01MDM, 00:19 01-05-2011
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    > s/<h[1-6].*>\(.*\)<h[1-6]>/\1/
    Не-не-не, так нельзя. Сед работает в жадном режиме, и в ленивом не умеет.
    Да и вообще, этим выражением будет сделана не выборка субстрок, а не пойми что (не забывайте, что от <h1> до </h1> — это едва ли вся строка, скорее всего часть строки).  
    Еще раз повторю, что Седом выборку субстрок лучше вообще не делать.
     
    Да, а вложенные тэги — это проблема, но в заголовках они редко есть, хотя вполне могут быть. Пойду почитаю ман по Грепу, возможно он и умеет ленивые регэкспы, я, честно говоря, не помню. :)
     
    Добавлено:
    Да, умеет, в режиме --perl-regexp (-P):
     
    $ grep -Po '<h[1-6].*?>.*?</h[1-6]>' file.html
     
    Вот славно, вложенные тэги — уже не проблема.

    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 00:50 01-05-2011 | Исправлено: ASE_DAG, 01:22 01-05-2011
    ndch

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    задача: генерировать десятичный цифры в диапазоне от 1 до %i
    в формате 0003 (в диапазоне от 0 до 9999) и формате как есть >9999
     
    т.е.  напримерПодробнее...
     
    %i  может быть в диапазоне от 1 до 49216
     
    сначала думал использовать for. в разбегу не подходит.
    for такое вообще умеет ?
     
    oc:xp

    Всего записей: 6487 | Зарегистр. 31-08-2008 | Отправлено: 01:12 01-05-2011 | Исправлено: ndch, 01:31 01-05-2011
    ASE_DAG



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ndch
    printf (любой, в т.ч. и стэндалоун из ГНУ Коръютилз) точно умеет.
     
    $ printf '%04.0f\n' 10
    0010


    Всего записей: 9272 | Зарегистр. 12-05-2005 | Отправлено: 02:04 01-05-2011
    NIKZZZZ



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

    Код:
    echo off
    setlocal enabledelayedexpansion
    for /l %%a in (1,1,49216) do (
      set x=%%a
      if !x! lss 10000 (
        set x=000!x!
        set x=!x:~-4!
      )
      echo !x!
    )


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 02:22 01-05-2011
    01MDM



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

    Цитата:
    Не-не-не, так нельзя.

    Это было не решение, я даже не проверял, а просто предположение.


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 07:36 01-05-2011
    ndch

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    так не получается:Подробнее...
     
    Добавлено:
    ASE_DAG

    Цитата:
    printf (любой, в т.ч. и стэндалоун из ГНУ Коръютилз) точно умеет.  
       
    $ printf '%04.0f\n' 10
     0010

     

    Код:
    C:\>printf '%04.0f\n' 10
    '-000
    '

     
    Спасибо за совет, получилось  

    Код:
    C:\>printf %04d 22189
    22189
     
    C:\>printf %04d 221
    0221
     
    C:\>printf %04d 2
    0002

    Всего записей: 6487 | Зарегистр. 31-08-2008 | Отправлено: 09:29 01-05-2011
    01MDM



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

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
     
    for /l %%i in (1,1011,49216) do (
     
        set "num=0000%%i"
        if %%i leq 9999 ( echo !num:~-4! ) else ( echo !num:~-5! )
     
    )
     



    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 10:04 01-05-2011
    NIKZZZZ



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

    Цитата:
    так не получается

    Скорее всего при копировании добавились пробелы.
     

    Код:
    echo off
    setlocal enabledelayedexpansion
    for /l %%a in (1,1,49216) do (
      set "x=%%a"
      if !x! lss 10000 (
        set "x=000!x!"
        set "x=!x:~-4!"
      )
      echo !x!
    )  


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 10:18 01-05-2011
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 10
    vu1tur (29-07-2011 12:47): Задачи на bat-файлах 11


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru