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

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

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

vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:54 27-04-2007 | Исправлено: Elroir, 03:59 10-09-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
    Ошибку понял. Спасибо.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 13:04 28-04-2007
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Чисто теоритический вопрос, почему это не работает?

    Код:
    echo Text | set /p Txt=???
    echo %txt%

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:33 28-04-2007
    Elroir



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

    Цитата:
    почему это не работает?

    Судя по всему, потому что echo каким-то образом создает новую среду, в которой переменной присваивается значение, а потом выходит из этой среды - так, что в той среде, где мы находимся, этой переменной ничего не присвоено. То есть происходит буквально следующее:

    Код:
     
    setlocal
    set txt=Text
    endlocal
    echo %txt%
     

    Что бы увидеть, что переменной все таки присваивается значение, запустим следующий код:

    Код:
     
    set txt=
    echo Text | (set /p txt= & set txt)
    set txt
     

     
    Добавлено:
    А может (даже скорее всего) не echo создает новую среду, а "|" (конвейер).

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:10 28-04-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    день добрый
    подскажите как в списке прибить левую часть до скобок во всех 4500 строках  
     
    MAIN\Ababkov_AV (Абабков Александр Васильевич)
    MAIN\Abramov_EV (Абрамов Евгений Валерьевич)
    MAIN\Abramova_EV (Абрамова Евгения Вячеславовна)
    MAIN\Abramova_TY (Абрамова Татьяна Юрьевна)
    MAIN\abramova_yv (Абрамова Юлия Валерьевна)
     
     
    FOR /F "TOKENS=2 DELIMS= " %%A IN (users.txt) DO set %%A
    type user.txt|gsar -s"%A%" -r -F>user1.txt

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 16:32 28-04-2007 | Исправлено: JohnRD, 16:45 28-04-2007
    Elroir



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

    Код:
     
    @echo off
    for /f "tokens=1* delims=(" %%a in (list.txt) do echo ^(%%b>>newlist.txt
     

    list.txt - файл со списком, newlist.txt - файл со списком, после обработки.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:39 28-04-2007 | Исправлено: Elroir, 16:40 28-04-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    спасибо,  
    реакция у Вас молниеносная я только решил дописать что я накромсал а тут... уже  
     
    есть еще вопрос  
    есть список 4500 строк
     
    Абабков Александр Васильевич
    Абрамов Евгений Валерьевич
    Абрамова Евгения Вячеславовна
    Абрамова Татьяна Юрьевна
    Абрамова Юлия Валерьевна
     
    есть еще список 1000 строк
     
    необходимо из первого списка удалить всех кто есть во 2ом

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 16:50 28-04-2007 | Исправлено: JohnRD, 16:56 28-04-2007
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Да, судя по второму примеру среду создает конвейер. Сразу же возникает вопрос, а можно ли определить глобальную переменную?
     
     
     
     
    Добавлено:
    JohnRD

    Цитата:
    есть список 4500 строк

    А время работы данного скрипта имеет значение?
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 17:00 28-04-2007 | Исправлено: NIKZZZZ, 17:08 28-04-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    до среды можно
     
    Добавлено:
    Elroir
    ошибся прошу прощения

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 17:10 28-04-2007 | Исправлено: JohnRD, 17:16 28-04-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    JohnRD
    Это не я спросил - это NIKZZZZ
    (Уже исправили)

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:12 28-04-2007 | Исправлено: Elroir, 17:13 28-04-2007
    igor_andreev

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

    Цитата:
    необходимо из первого списка удалить всех кто есть во 2ом

    А списки у тебя по алфавиту отсортированы? Если воспользуешься uniq.exe из UnxUtils в шапке - несколько секунд займет. Типа
     
    copy /b 4500.txt+1000.txt all.txt
    sort all.txt | uniq -u>new.txt
     
    Параметр -u у uniq - это "only print unique lines", она в отсортированном списке не будет выдавать в stdout(в new.txt) повторяющиеся строчки.

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 17:33 28-04-2007
    Tipulatoid



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

    Цитата:
    необходимо из первого списка удалить всех кто есть во 2ом

    Ну если без стронних утилит, то так. Скорость не обещаю:

    Код:
    @echo off
    for /f "tokens=*" %%a in (list1.txt) do (
       find "%%a" list2.txt > nul & if errorlevel 1 echo %%a >> list3.txt
    )

    list1.txt - большой список (4500 строк), list2.txt - малый список (1000 строк), list3.txt - результат (4500-1000=3500 строк)

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 17:45 28-04-2007 | Исправлено: Tipulatoid, 17:46 28-04-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev
    супер утилита, в начале я подумал что ошибка а она уже все сделала..
    спасибо большое
     
     
    Tipulatoid
    запускаю в среду отпишу результат.
     
    спасибо Всем

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 17:54 28-04-2007 | Исправлено: JohnRD, 17:59 28-04-2007
    Elroir



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

    Цитата:
    Скорость не обещаю

    Код 10 минут работал на файлах с 6000 и 2000 строк. Тот, который я написал (я его не стал выкладывать) - примерно столько же. Так что лучше пользоваться спец. утилитами, как предложил igor_andreev.
     
     
    Добавлено:
    NIKZZZZ

    Цитата:
    Да, судя по второму примеру среду создает конвейер. Сразу же возникает вопрос, а можно ли определить глобальную переменную?

    Насколько я понимаю - нет.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 18:12 28-04-2007 | Исправлено: Elroir, 18:18 28-04-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Уважаемый igor_andreev к сожалению в данной ситуации некорректно переформулировал задачу - в исходных условиях нет упоминания о том что все записи первого списка уникальны...
    Поэтому код уважаемого Tipulatoid предпочтительнее в общей ситуации...  
     


    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 19:35 28-04-2007
    igor_andreev

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

    Цитата:
    в исходных условиях нет упоминания о том что все записи первого списка уникальны

    Если бы они были не уникальны - у JohnRD было бы еще одно условие, по которому нужно различать в списке с 4500 ФИО двух разных людей, у которых ФИО совпадает полностью. Адрес там напротив фамилии, или профессия или еще что. Иначе не узнать, какого из двух Абабковых Александров Васильевичей из первого списка(с 4500 строк) нужно удалять, если один Абабков Александр Васильевич есть в во втором списке(с тысячей строк).

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 20:12 28-04-2007
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    igor_andreev
    Вы все как-то по старинке задачи решаете. Ну, где скажите у вас используются ресурсы комп'ютера, почему большие об'емы современных винтов не используете? Что о вас скажут призводители нового железа? Вот как решать такую задачу надо

    Код:
    echo.>common.bat
    copy list1.txt Result.txt
    for /f "delims=" %%i in (list2.txt) do (
     echo Type result.txt ^| find /v "%%i" ^> "Result_Delete_%%i.txt">"Delete_%%i.bat"
     echo copy /y "Result_Delete_%%i.txt" result.txt>>"Delete_%%i.bat"
     echo call "Delete_%%i.bat">>common.bat
    )
    call common.bat


     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 02:13 29-04-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Ну замутил!!!
    Я даже не сразу сообразил, как этот код работает!
    P.S.
    Цитата:
    Вы все как-то по старинке задачи решаете.  

    Видно крепко в меня в универе вбили понятия оптимизации и эффективности программ
    P.P.S. Кстати, вон у igor_andreev-а батник MATRIX_TT.CMD почти 5 килобайт кода!

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 03:20 29-04-2007
    euheny



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    NIKZZZZ
    igor_andreev
    Tipulatoid
     
    А про findstr уже забыли ? - побыстрее и проще будет.

    Всего записей: 4064 | Зарегистр. 22-11-2006 | Отправлено: 04:27 29-04-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    euheny
    Быстрее и проще, чем предложил igor_andreev?
    Я хочу это увидеть! Код в студию!

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 04:32 29-04-2007
    igor_andreev

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    euheny имеет ввиду подсунуть для findstr файл с тысячей строчек в качестве /g:file и выводить с /v. Я про findstr помню, но она у меня на чем то спотыкалась как-то давно, кажется на файле с очень длинными строчками, поэтому предпочитаю надежности ради ею не пользоваться

    Всего записей: 1705 | Зарегистр. 08-12-2004 | Отправлено: 05:06 29-04-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 3
    vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru