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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Проще будет прикрутить утилиту, например du из GNU utilities for Win32, чтобы показывала размер в килобайтах. Файла более 2 терабайт точно не попадётся.)

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 21:29 04-11-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ну чтоб не сравнивать по частям можно заюзать такой код:
    Код:
    @echo off
    if exist 11111.txt del /f /q 11111.txt
    setlocal enabledelayedexpansion
    for /r %1 %%i in (*) do set "zzzzz=z000000000000000%%~zi"&set zzzzz=!zzzzz:~-15!&echo !zzzzz! : %%i>>11111.txt
    sort 11111.txt /o 11111.txt
    for /f "tokens=1* delims=: " %%i in (11111.txt) do set "big_file=%%j"
    attrib +h "%big_file%"
    if exist 11111.txt del /f /q 11111.txt
    правда используется один временный файл, но зато файлы с размером в байтах общей длиной до 15 символов(че-то порядка 100 терабайт - это я на всякий случай, с запасом взял) будут обработаны корректно.
    Если временный файл не удалять то в нем получим список файлов с размерами отсортированный по размеру.
    Может принимать параметр из командной строки - директория которую обрабатываем, но он необязателен и если не указан то обработка выполняется с текущей директории.

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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 21:30 04-11-2007 | Исправлено: yurkesha, 21:32 04-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir  
    Только что проверил на файлах более 4 гигов, всё работает.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 21:53 04-11-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven -
    Действительно работает! Проверено на файлах размером более 20 гигов.
    Ограничение по видимому срабатывает только при вычислениях через SET /A

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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 22:27 04-11-2007
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    У меня самый большой файл ровно 2Гб. Он как раз показал такое значение (2 147 483 647)

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 22:50 04-11-2007 | Исправлено: 01MDM, 23:21 04-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    Нет, вроде не работает. Короче, спать надо.

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Только что попробовал, создал файл 4+ Гб файл, показывает полную длину и определяется как самый большой.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 23:19 04-11-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven - твой код точно работает! Я натравлиал его на папку с видео где максимальный размер файла составляет 25,4 ГБ (27 379 406 708 байт) - все отработало корректно! Но если кому мало такого объема - пусть использует тот код что привел я - сомневаюсь чтоб кого-либо не устроило ограниечение порядка 100 терабайт(если все-таки кому надо - увеличиваем число ноликов до нужного и ~-15 меняем на число нулей...).


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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 23:31 04-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    У меня барахлит, вот по совету Elroir  

    Код:
    @echo off
    setlocal enabledelayedexpansion
    for /r %%e in (.) do call :wer "%%e"
    ATTRIB +H "!big_file!"
    goto :eof
    :wer
    for /f "tokens=*" %%c in ('dir %1 /b /o:-s /s /a:-d') do (
        if %%~zc LEQ 2147483646 (
            if %%~zc GTR !size! (
                set big_file=%%c
                set size=%%~zc
            )
            goto werty
        ) else (
            set j=%%~zc
            set j1=!j:~0,-9!
            set j2=!j:~-9!
            if !j1!=="!size:~0,-9!" (
                if !j2! GTR "!size:~-9!" (
                    set big_file=%%c
                    set size=%%~zc
                )
                goto werty
            )
            if !j1! GTR "!size:~0,-9!" (
                set big_file=%%c
                set size=%%~zc
            )
            goto werty
        )
    )
    :werty

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 00:31 05-11-2007 | Исправлено: king_stiven, 02:19 05-11-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    yurkesha
    01MDM
    Насчет работает-не работает:
    if 2147483647 GTR 2147483646 echo greater - работает (2^31-1 и 2^31-2)
    if 2147483648 GTR 2147483647 echo greater - не работает (2^31 и 2^31-1)
    if 2147483648 GTR 1147483647 echo greater - работает (2^31 и 2^30)
    if 2147483648 GTR 1 echo greater - работает (2^31 и 1)
    if 4294967296 GTR 2147483648 echo greater - не работает (2^32 и 2^31)
    Все это на WinXP 32-bit. Я не знаю, меняется ли что-нибудь, если бежит 64-битная OS.


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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 01:24 05-11-2007
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Да не работает. Показывает последний из больших найденных файлов (>=2147483648)

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 10:20 05-11-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Вот теперь понятно. К моему коду тоже есть замечания?

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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 12:06 05-11-2007
    Elroir



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

    Цитата:
    К моему коду тоже есть замечания?

    Не то чтобы замечания...
    Если я правильно понял (запустить сейчас нет возможности), он записывает во временный файл размеры всех файлов в директории и поддиректориях. У нас цель, все-таки, найти самый большой файл, поэтому, на мой взгляд, эффективнее будет для каждой поддиректории запускать и обрабатывать "dir /os", и записывать во временный файл только самый большой файл в директории.  
     
     
    Добавлено:
    Вообще - это, конечно, усложняет код (вытаскивать из dir-а размер и т.д). Поэтому - замечаний нет

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 12:42 05-11-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Да это в принципе как раз роли не играет... Я о другом - есть принципиально два разных подхода на сравнение чисел:
    - сравнить как числа
    - выровнять до одинаковой длины добив нулями слева и сравнить как стринги.
    И я применил именно второй подход. В отличии от первого он легко масштабируется по разрядности(то что я называл порядок ограничения в 100 терабайт на самом деле означает цифири в 900 с копейками терабайт).  
    А во временный файл действительно пишутся размеры абсолютно всех файлов, хотя на выходе и имеем только один - максимальный.

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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 13:20 05-11-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    Оба подхода имеют равные права на существование. Оба делают, то что нужно.
    Как ты и сказал - если сравнивать как числа, получается два сравнения, а если строчки одно. В данном случае, все зависит от того, кому как удобно.
    А насчет того, что код проходит по всем файлам - представь, что на диске есть несколько десятков или сотен тысяч файлов...

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:12 05-11-2007
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir как ты думаешь - может ли код индивидуального сравнения внутри цикла превзойти по скорости команду SORT? Вообще интересно было бы проверить


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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 14:22 05-11-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    Как правило все операции с временными файлами нагружают комп, замедляют работу. Кстати я свой код подправил, сравнивал по времени с 01MDM, скорость в 2 раза выше.

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



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

    Цитата:
    как ты думаешь - может ли код индивидуального сравнения внутри цикла превзойти по скорости команду SORT?

    Не думаю, что может.
    Я не то имел в виду. SORT пусть сортирует
    Но ведь цикл проходит по всем файлам, для каждого файла берется его размер и записывается во временный файл. Вот я и предложил, вместо того чтобы обрабатывать каждый файл, брать из dir-a только один - самый большой в данной директории и записывать в файл (для последующей сортировки) только его.

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

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

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

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    Выигрыш во времени при использовании dir-a на примерно 70000 файлов, получается около 20 процентов (твой код работал 5 мин., мой - 4 мин.)

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 17:46 05-11-2007 | Исправлено: Elroir, 17:47 05-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