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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    moonkir
    здесь посмотри и  
    здесь

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 15:02 14-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ...
    Я ненаю как его к своему применить ...

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 15:55 14-10-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    to all:
    Как известно, команда fsutil fsinfo drives выводит в строку список доступных дисков. Мне его нужно записать в переменную. Однако

    Код:
    for /f "tokens=1*" %%a in ('fsutil fsinfo drives') do set drives=%%b
    echo %drives%

    записывает в %drives% только первый диск, а не всю строку. Решение не подскажете?

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 16:28 14-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    я как то не уточнил что мне нужен общий прогресс-бар
    К примеру у меня есть 318 файлов(в данный момент так), их нужно распаковать.
    И отобразить общий процес распаковки прогресс-баром.
    На пример квадратными собками в которых 50 символов #
    [############################################################]
    Тоесть на 318 файлов у нас есть 50 символов. На каждый символ по 6,24 файла. Тоесть коггда распаковалось 6ть (округляю 6,24 до 6) файлов появился один символ
    [#===========================================================]
    Теперь файлов стало на 6 меньше, тоесть 312 (318-6). Теперь и знаков стало меньше и файлов. На каждый знак приходиться по 6,36 файла. И опять по схема до 6ти округляется и добавляеться один символ, когда распакуеться 6ть файлов.
    [##==========================================================]
     
    И так далее, будет четко виден прогресс. И по идее число которое получается при делении кол-ва файлов на 50 символов всегда будет одинаково. И тогда будет четкий прогресс-бар
     
    Извините что так загнул, незнаю как по другому рассказать...

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 16:52 14-10-2007
    Elroir



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

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

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

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Я по поводу своих баранов, фактически нужно подсчитать кол-во файлов и поделить их на 50. Пусть получаемое число будет Х, и после каждых Х обновлений добавлять один символ #. К примеру число Х=2 то вид будет такой:
     
     

    Код:
    Распаковывается 1 из ХХ(здесь нужно как то узнавать кол-во обновлений в папке) обновление ХХХХХ.msu...  
    [============================================================]


    Код:
    Распаковывается 2 из ХХ обновление ХХХХХ.msu...  
    [#===========================================================]


    Код:
    Распаковывается 3 из ХХ обновление ХХХХХ.msu...  
    [#===========================================================]


    Код:
    Распаковывается 4 из ХХ обновление ХХХХХ.msu...  
    [##==========================================================]


    Код:
    Распаковывается 5 из ХХ обновление ХХХХХ.msu...  
    [##==========================================================]


    Код:
    Распаковывается 6 из ХХ обновление ХХХХХ.msu...  
    [###=========================================================]

     
    Это как бы по кадрам что должен увидетья в конечном итоге...
     
    Синтаксис такой получаеться:
    1 узнаем кол-во распаковываемых файлов
    2 делим кол-во распаковываемых файлов на 50 и получаем число Х
    3 распаковываем циклом обновления и проверяем не равно ли распакованое кол-во файлов числу Х, если равно то добавляем #, если не равно - распаковываем дальше.
     
    Ну и в таком стиле, только минус в том, если файлов будет 50 или меньше 50ти ... то ни фига не выйдет ...

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 17:06 14-10-2007 | Исправлено: moonkir, 17:29 14-10-2007
    king_stiven

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

    Код:
    for /f "tokens=*" %%a in ('fsutil fsinfo drives ^| find "\"') do set drives1=!drives1! %%a
    for /f "tokens=1*" %%a in ("!drives1!") do set drives=%%b
    echo %drives%

     
    либо

    Код:
    setlocal enabledelayedexpansion
    for /f "tokens=1*" %%a in ('fsutil fsinfo drives ^| find "\"') do (
        if defined first (
            set drives=!drives! %%a
        ) else (
            set drives=!drives!%%b
            set first=yes
        )
    )
    echo !drives!

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 17:48 14-10-2007 | Исправлено: king_stiven, 19:12 14-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ну кол-во думаю обновлений думаю можно так посчитать
     
    dir /b >../list.txt
     
    а потом в листе посчитать кол-во строк... я не наю как строки посчитать

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

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

    Цитата:
    я не наю как строки посчитать  


    Код:
     
    for /f %%a in ('dir /b') do set /a pusk+=1
    echo %pusk%


    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 18:57 14-10-2007 | Исправлено: king_stiven, 19:03 14-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven
    нужно считать из другой папки, а то он и себе считает(батник всмысле)
     

    Код:
    for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a pusk+=1  
    echo %pusk%

     
    Добавлено:
    Ну уже пол дела. Как теперь получить число(%pusk% нужно разедилть на 50), округлить и потом с этим числом как с переменной работать...

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 19:12 14-10-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    moonkir
    set /a pusk/=50
    Ты лучше посчитай, сколько символов в ком строке ### при 100% загрузке ты хочеш видеть. от этого плясать надо.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 19:30 14-10-2007 | Исправлено: king_stiven, 19:39 14-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven
    я уже написал, 50, но в принцыпе можно любое кол-во
     
    Добавлено:
    Хорошо получаем мы число pusk
    Как теперь отсчитывать кол-во (set /a pusk/=50)распакованых обновлений  
     
    Добавлено:
    хм... если... вроде понял, щас попробую
     
    Добавлено:
    щас у меня вот так выглядит
    Код:
    @ECHO OFF  
    setlocal enabledelayedexpansion  
    :Extract
    for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolvo+=1    
    for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolv+=1    
    set /a kolv/=74
    Set /a N=0
    echo.  
    cd msu  
    For %%F In ("*.msu") Do Call :Ext %%F  
    goto Exit  
    :Ext
    cls
    Set /a N+=1
    echo                        -=Распаковка обновлений=-  
    echo.
    echo Распаковывается %N% из %kolvo% обновлений
    echo %1 ...
    echo.
    :: вот на этом месте я думаю нужно сравнивать переменные
    :: если %N% деленное на %kolv% равно 1 то одна решетка #  
    :: [#===================================================================================]
    :: если %N% деленное на %kolv% равно 2 то две решетки ##  
    :: [##==================================================================================]
    :: ну и так далее, а вот как написать ненаю

    if defined updall goto continue  
    if exist  "..\Cab\%~n1.cab" (  
    echo.
    echo Обновление с таким именем уже существует
    :Choice
    echo.
    set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?  
    echo.
    if "!choice:~0,1!"=="o" goto continue  
    if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)  
    if "!choice:~0,1!"=="s" goto :EOF  
    goto :Choice  
    )  
    :continue  
    call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul  
    ::Удаление лишних файлов  
    del /f /q "..\Cab\*.xml" > nul  
    del /f /q "..\Cab\*.txt" > nul  
    del /f /q "..\Cab\WSUSSCAN.cab" > nul  
    GoTo :EOF  
       
    :Exit
    exit

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 19:58 14-10-2007 | Исправлено: moonkir, 20:39 14-10-2007
    king_stiven

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

    Код:
    @ECHO OFF
    setlocal enabledelayedexpansion
    :Extract
    for /f %%a in ('dir msu /b') do set /a kolvo+=1
    set file=1
    set "bar=#-------------------------------------------------------------------------"
    echo.
    cd msu
    For %%F In ("*.msu") Do Call :Ext %%F
    goto Exit
    :Ext
    Set /a N+=1
    set "vsego=!N!"
    set /a vsego*=74
    set /a vsego/=%kolvo%
    call :tyu
    cls
    echo                        -=Распаковка обновлений=-
    echo Распаковывается !N! из %kolvo% обновлений
    echo %1 ...
    echo !bar!
    if defined updall goto continue
    if exist  "..\Cab\%~n1.cab" (
    echo.
    echo Обновление с таким именем уже существует
    :Choice
    echo.
    set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?
    echo.
    if "!choice:~0,1!"=="o" goto continue
    if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)
    if "!choice:~0,1!"=="s" goto :EOF
    goto :Choice
    )
    :continue
    call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul
    ::Удаление лишних файлов
    del /f /q "..\Cab\*.xml" > nul
    del /f /q "..\Cab\*.txt" > nul
    del /f /q "..\Cab\WSUSSCAN.cab" > nul
    GoTo :EOF
    :Exit
    exit
    GoTo :EOF
    :tyu
    :ert
    if !vsego! GTR !file! (
        set "bar=#!bar!"
        set /a file+=1
        set "bar=!bar:~0,-1!"
        goto :ert
    )

     
     
    Проверь строчки!

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 22:34 14-10-2007 | Исправлено: king_stiven, 10:24 15-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Вопрос решил так:
    И %N% не меняется  

    Код:
    @ECHO OFF  
    setlocal enabledelayedexpansion  
    :Extract
    for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolvo+=1    
    for /f "usebackq tokens=* " %%a in (`dir msu /b`) do set /a kolv+=1    
    set /a kolv/=74
    Set /a N=0
    echo.  
    cd msu  
    For %%F In ("*.msu") Do Call :Ext %%F  
    goto Exit  
    :Ext
    cls
    Set /a N+=1
    echo                        -=Распаковка обновлений=-  
    echo.
    echo Распаковывается %N% из %kolvo% обновлений
    echo %1 ...
    echo.
     
    set /a T=%N%
    set /a T/=%kolv%
    ::Теперь к цифре получаемой из %T% нужно привязать кол-во символов # (кол-во символов # равно %Т%)

     
    if defined updall goto continue  
    if exist  "..\Cab\%~n1.cab" (  
    echo.
    echo Обновление с таким именем уже существует
    :Choice
    echo.
    set /p choice=Заменить^(o^),Пропустить^(s^),Заменить Все^(a^)?  
    echo.
    if "!choice:~0,1!"=="o" goto continue  
    if "!choice:~0,1!"=="a" (set "updall=true" & goto continue)  
    if "!choice:~0,1!"=="s" goto :EOF  
    goto :Choice  
    )  
    :continue  
    call ..\tools\servicing\expand -F:* "%1" "..\Cab" > nul  
    ::Удаление лишних файлов  
    del /f /q "..\Cab\*.xml" > nul  
    del /f /q "..\Cab\*.txt" > nul  
    del /f /q "..\Cab\WSUSSCAN.cab" > nul  
    GoTo :EOF  
       
    :Exit
    exit

     
    Добавлено:
    Можно конечно сделать 74 условия но это гон

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 23:01 14-10-2007 | Исправлено: moonkir, 23:02 14-10-2007
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    moonkir
    Смотри предыдущий пост, количество знаков # там прописано 74 в этой строке:
    set /a vsego*=74  
    А вообще у тебя этот скрипт работал? Как то там всё странновато...
    операторы goto например, не будут давать делать циклы

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 23:34 14-10-2007 | Исправлено: king_stiven, 00:44 15-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven
    скрипт это echo !bar! не показывает
    Режим вывода команд на экран (ECHO) отключен.
     
    Добавлено:
    Да, работал

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 23:56 14-10-2007
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 23:59 14-10-2007 | Исправлено: king_stiven, 00:33 15-10-2007
    moonkir

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

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

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    moonkir
    Откуда у тебя пробелы затесались? У меня при проверке их нету.
     Вот в эти строки ты пробел не вставил?

    Код:
    if !vsego! GTR !file! (  
        set bar=!bar!#  
        set /a file+=1  
        goto :ert  
    )  
    if !vsego! EQU 0 set bar=#  

     
    А скорей всего
     
    Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!  
     
     
    Добавлено:
    На всякий случай подстрахуюсь "
     
    Добавлено:
    Может тебе ещё надо и ###===============
    вместо просто              ###                           ? )

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 01:51 15-10-2007 | Исправлено: king_stiven, 01:54 15-10-2007
    moonkir

    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Пробелы поубирал, заработало, но блин это мелькание после cls кумарит ппц и пропадет суть самого прогресс бара, не видно где он заканчивается...

    Всего записей: 287 | Зарегистр. 04-11-2006 | Отправлено: 02:46 15-10-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