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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    all
     
    Раз пошли разговоры об оптимизации скриптов, то прошу совета по моему вопросу. Код приведен немаленький, и не всем он интересен, поэтому скрою под тэгом more:
    Подробнее...

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 05:15 06-11-2007 | Исправлено: Tipulatoid, 05:37 06-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Ну например если в этой строчке  
    echo %%a | find /i "-----" >nul && goto :eof
    мы используем не find /i а find , скорость должна повыситься. Если можно использовать findstr /c:,повыситься ещё больше. Кстати, так до конца и не понял между этими командами различий, может лучше всегда использовать findstr, чем find?

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 10:07 06-11-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Это если и даст выигрыш, то мизерный. Как вы видели, у меня find обрабатывает всего только несколько строк в конце аттача. Плоха сама идея построчного переписывания в другой файл. Может, есть какая другая?

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 17:09 06-11-2007 | Исправлено: Tipulatoid, 17:15 06-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Вот эти скобки смущают:
             (  
                if defined mail1_adress echo !mail1_adress!  
                if defined mail2_adress echo !mail2_adress!  
                if defined mail3_adress echo !mail3_adress!  
                if defined mail4_adress echo !mail4_adress!  
                if defined mail5_adress echo !mail5_adress!  
             )>>!group_num!maillist.del  
    Если б в выложенном примере пояснения были. что там происходит. С батом не сталкивался. и пример .eml файла.
     
    Добавлено:
    переменные %%a из
     
    for /l %%a in (1,1,%group_quan%) do (  
                ...
       for /f "skip=2 delims=] tokens=1*" %%a in ('find "[Group !group_num! mail name]" %file%') do (
                ...
             for /f %%a in ('dir *.eml /b /a:-d') do (
                ...
    имеют по батнику одно значение, это правильно?
     
    как понимать
             for /f %%a in ('dir *.eml /b /a:-d') do (  
                for /f %%a in ('findstr /g:!group_num!maillist.del /m %%a') do (  
                ...
     ??
     
          if exist *.eml (  
             for /f %%a in ('dir *.eml /b /a:-d') do (  
                for /f %%a in ('findstr /g:!group_num!maillist.del /m %%a') do (  
     
    или я чего то не понимаю

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:54 06-11-2007 | Исправлено: king_stiven, 18:44 06-11-2007
    Tipulatoid



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

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 19:24 06-11-2007 | Исправлено: Tipulatoid, 19:27 06-11-2007
    king_stiven

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

    Цитата:
    Выделенные красным %%a - это просто задание первой переменной, действительной ТОЛЬКО внутри своего цикла (то, что содержится в скобках после do; если в цикл вложен другой цикл, то новая %%а работает только внутри нового подцикла), а не по всему батнику.  

     
    Неужели так бывает?

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 20:30 06-11-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Может, я как-то коряво выразился. Может, то что, я хотел сказать лучше скажет такой код:

    Код:
    @echo off
    for /l %%a in (1,1,5) do (
       echo Первый цикл %%a
       for /l %%a in (1,1,5) do (
          echo Второй цикл %%a
       )
    )

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 20:56 06-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Аттачи всегда состоят из определённого числа строк?
     
    В этом куске

    Код:
    detach  
    set count=0  
    for /f "tokens=*" %%a in ('more +%~1 %~2') do (  
       set /a count+=1  
       if /i !count! lss %~4 (  
          echo %%a>>%~3  
       ) else (  
          echo %%a | find /i "-----" >nul && goto :eof  
          echo %%a>>%~3  
       )  
    )

     
    для данного конкретного примера .eml чему равны переменные %~1 %~2 %~4 ?
     
    Провёл такой эксперимент, засунул аттач в 1.txt

    Код:
    @ECHO OFF  
    for /f "usebackq tokens=*" %%a in ("c:\TEMP\1.txt") do (
        echo %%a | find /i "-----" >nul && goto :eof
        echo %%a>>2.txt
    )

    результат 2,5 сек
     

    Код:
    @ECHO OFF
    for /f "usebackq tokens=*" %%a in ("c:\TEMP\1.txt") do (
        echo %%a | findstr /c:"-" >nul && goto :eof
        echo %%a>>2.txt
    )

    результат 1,5 сек

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 21:23 06-11-2007 | Исправлено: king_stiven, 21:26 06-11-2007
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    Конкректно по аттачу, но последняя строка (пустая) остается:

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    set skip=0
    set numlines=0
    for /f "delims=" %%i in ('type mail.txt ') do (
        echo "%%i" | findstr "filename">nul && set skip=!numlines! || set /a numlines+=1
    )
     
    set /a skip+=5 :: 5 - кол-во строк после "filename", если во всех письмах одинаково, то гут  
    set /a postskip=numlines-skip-1
    set count=0
    for /f "skip=%skip% tokens=*" %%i in ('type mail.txt') do (
        if not !count! equ %postskip% (
            set /a count+=1 && if not "%%i"=="" echo %%i>>attach.txt
        )
    )
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 21:29 06-11-2007 | Исправлено: 01MDM, 21:34 06-11-2007
    BlackCerber



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Please помогите!!!
    В общем мне нужны примеры команды для создания пользователя в определённой группе.
     
    поясню:
    Есть локальная сеть, комп в этой сети. К этому компу надо получить права админа (так чтобы мог заходить на C$, D$, E$ и т.д. ну вы меня поняли) Было уже подобное дело всё получилось но прикол в том что я не помню что за команды!!!
    P.S.: Забыл пояснить... Команду можно вписать в назначенные задания (они почемуто расшаренные и команды прекрасно исполняются)
     
    Вопрос ламерский но я нифига не помню.  
    ОС: WinXP
     
    Если можно в батнике это дело сделать то это только плюс... батник есть возможность тоже подсунуть.
     
    только естественно чтобы батник тихо себя вёл при запуске.. ну или писал ерунду какую-нибудь.

    Всего записей: 233 | Зарегистр. 06-10-2003 | Отправлено: 21:47 06-11-2007 | Исправлено: BlackCerber, 21:51 06-11-2007
    Elroir



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

    Цитата:
    Может, то что, я хотел сказать лучше скажет такой код

    Интереснее так:

    Код:
     
    @echo off
    for /l %%a in (1,1,5) do (  
       echo Первый цикл %%a  
       for /l %%a in (1,1,%%a) do (  
          echo Второй цикл %%a  
       )  
    )  
     



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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:55 06-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    По моему только путаница будет, посмотри на его код
    Цитата:
    Подробнее...


    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 22:03 06-11-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Я видел, но не стал разбирать - времени не было. А сейчас просто голова не работает.
    Предыдущий мой пост не связан с основной проблемой. Я просто чуть переделал код Tipulatoid-a - пример интересного поведения уже определенной переменной во внутреннем for-e.
     
     
    Добавлено:
    Tipulatoid
    Как я сказал выше, код я внимательно не читал. Но.. навскидку идея:
    Насколько я понял, нам известна строка, с которой начинается attachment. Предположим, что это десятая строка. Тогда можно попробовать следующее:

    Код:
    type file | more +10 /s | find /v "---" | findstr /v /r "^$">>attach.hex
     

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 22:21 06-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Блестяще! Я как раз думал как использовать символ конца строки.
    Время по анологии с вышеприведённым 0,5 сек
     
    можно даже так

    Код:
    more +1 /s file | find /v "---" | findstr /v /r "^$">>attach.hex

     
    Tipulatoid
     
    Строка начала аттача определена?
     
    Добавлено:

    Код:
    more +1 /s file | findstr /v /C:"---" | findstr /v /r "^$">>attach.hex

     
    0,25 сек  кто быстрее?)

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 23:01 06-11-2007 | Исправлено: king_stiven, 23:34 06-11-2007
    Elroir



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

    Цитата:
    кто быстрее?)

    Зависит от процессора
    У меня, например, последний твой вариант бежит за 0.12 секунды, а мой - 0.19 секунды.

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 00:13 07-11-2007
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 00:31 07-11-2007
    paveltr



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нет ли у кого на примете редактора mp3 для cmd? Есть необходимость порезать большой mp3-файл (~100-150 Мб) на мелкие (2-3 Мб каждый кусок)

    Всего записей: 18 | Зарегистр. 01-04-2006 | Отправлено: 01:18 07-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    paveltr
    Ты можешь нарезать любой резалкой, а потом переименовать кусочки по маске в mp3 mp3 directcut порежет в комстроке по длительности или по паузам с примерной длительностью( но настройки в комстроке недоступны). Rar порежет по разиеру, утилита split.exe из GNU utilities for Win32 тоже.
     
    WinRAR.exe a -m0 -v6m -inul файл_выхода резаемый_файл
     
    или
     
    RAR.exe a -m0 -v6m -inul файл_выхода резаемый_файл
     
    по 6 мегов порежет
     
     
    Elroir
     
    Если пустые строки не мешают

    Код:
    more  +1 /s exc_rus.txt | findstr /B /v /c:"---">>attach.hex

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 01:46 07-11-2007 | Исправлено: king_stiven, 01:57 07-11-2007
    Tipulatoid



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

    Цитата:
    Аттачи всегда состоят из определённого числа строк?

    нет
    Elroir

    Цитата:
    Насколько я понял, нам известна строка, с которой начинается attachment.  

    king_stiven

    Цитата:
    Строка начала аттача определена?

    Да, верно
     
    Проверил все предложеные варианты на своем Athlon XP 2800+ на тестовом письме с примерно полумегабайтным аттачем (переписать нужно было 7511 строк)
     
    Первый вариант king_steven (он же был и моим первым вариантом, когда начинал писать свой код)
    Код:
    @echo off
    echo %time%
    for /f "skip=41 tokens=*" %%a in (00000001.eml) do (
        echo %%a | find /i "-----" >nul && goto :eof
        echo %%a>>2a.txt
    )
    echo %time%
     
    - загрузка проца 100% постоянно, время - 26 минут 14 секунд
     
    Второй вариант king_steven
    Код:
    @ECHO OFF
    echo %time%
    for /f "skip=41 tokens=*" %%a in (00000001.eml) do (
        echo %%a | findstr /c:"-" >nul && goto :eof
        echo %%a>>2b.txt
    )
    echo %time%

    - загрузка проца 100% постоянно, время - 19 минут 15 секунд
     
    Превосходная идея 01MDM (если я правильно ее понял ) привела к такому шустрому коду
     

    Код:
    @ECHO OFF
    setlocal enabledelayedexpansion
    echo %time%
    for /f "skip=41 tokens=*" %%a in (00000001.eml) do (
        set attline=%%a
        set first_symbols_attline=!attline:~0,5!
        if /i !first_symbols_attline! neq ----- (
           echo !attline!>>2c.txt
        ) else (
           goto :next_label
        )
    )
     
    :next_label
    echo %time%

     
    - загрузка проца 100%; время 7,5 секунд!!!
     
    Блестящий вариант Elroir с king_stiven

    Код:
    @echo off
    echo %time%
    more +41 /s 00000001.eml | findstr /v /c:"-----" | findstr /v /r "^$">>2e.txt
    echo %time%

     
    - загрузка проца - не успел разглядеть ; время 0,78 секунды!!! Великолепно. Только я чего-то не сообразил. Eml-файл вполне может иметь 2 аттача. Вот возможный его кусок:
    Код:
    ------==--bound.27657.webmail15.yandex.ru  
    Content-Disposition: attachment;  
        filename="Action16.DAU"  
    Content-Transfer-Encoding: base64  
    Content-Type: application/octet-stream;  
        name="Action16.DAU"  
     
    hTvfT40CgwAAAABAgLTIdr5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhgAA  
    .....
    .....
    hgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAfIlBYOVQgQAAAAAAgQAAAAAA  
    gQAAAAAA  
     
    ------==--bound.27657.webmail15.yandex.ru--
     
    ------==--bound.27689.webmail15.yandex.ru  
    Content-Disposition: attachment;  
        filename="lalala.doc"  
    Content-Transfer-Encoding: base64  
    Content-Type: application/octet-stream;  
        name="lalala.doc"  
     
    hTvfT40CgwAAAABAgLTIdr5/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhgAA  
    .....
    .....
    hgAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  
    IRYQIWRLQWJDAJSDJWDHWIQUHIUAHSDHHDQWTE2G4ISUHIASYD827Y4E12HJHWQIUDHWQIEYQWIEHQW
    DJWHEKJQH
     
    ------==--bound.27689.webmail15.yandex.ru--  
     
     
    Нужно, чтоб ваш код прекращал выполняться после обнаружения выделеной строки. Возможно ли это?
     
    Всем Огромное спасибо. Вы очень помогли
    Добавлено:
    Узнать номер выделеной строки - не проблема. Команда more в интерактивном режиме имеет полезную команду P n - вывод следующих n строк. А в батник ее можно как-нибудь запихнуть?

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 04:55 07-11-2007 | Исправлено: Tipulatoid, 09:25 07-11-2007
    01MDM



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

    Цитата:
    41

    А формат письма никогда не меняется?

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 09:21 07-11-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 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