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

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425 Кажись начало доходить благодарствую.

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 17:39 15-10-2007
    king_stiven

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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    for %%a in (*.*) do set /a kolvo+=1
    set file=1
    set e=1
    set "bar=#__________________________________"
    For %%F In (*.*) Do (    
        Set /a N+=1
        set vsego=!N!
        set Percent=!N!
        set /a Percent*=100
        set /a Percent/=%kolvo%
        set /a vsego*=35
        set /a vsego/=%kolvo%
        call :tyu
        if defined e Title !Percent!^%% [!bar!] > nul
        xcopy "%%F" A:\ > nul
        set e=
    )
    GoTo :EOF
    :tyu
    :ert
    if !vsego! GTR !file! (
        set "bar=#!bar!"
        set /a file+=1
        set "bar=!bar:~0,-1!"
        set e=1
        goto :ert
    )

    Вот мой пример копирования всех файлов на диск A:\  . Под себя сам переделай. Число значков в  
    set "bar=#__________________________________"
    связано с 35 из set /a vsego*=35 . А пробелы ты всё равно плохо удаляешь!

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

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

    Код:
    @echo off  
    setlocal enabledelayedexpansion  
    for %%a in (*.*) do set /a kolvo+=1  
    set file=1  
    set e=1  
    set "bar=#__________________________________"  
    For %%F In (*.*) Do (    
        Set /a N+=1  
        set vsego=!N!  
        set Percent=!N!  
        set /a Percent*=100  
        set /a Percent/=%kolvo%  
        set /a vsego*=35  
        set /a vsego/=%kolvo%  
        call :tyu  
        if defined e Title !Percent!^%% [!bar!] > nul  
        xcopy "%%F" A:\ > nul  
        set e=  
    )  
    GoTo :EOF  
    :tyu  
    :ert  
    if !vsego! GTR !file! (  
        set "bar=#!bar!"  
        set /a file+=1  
        set "bar=!bar:~0,-1!"  
        set e=1  
        goto :ert  
    )

     
    Выделеное лишнее, я точно так же тоолько что делал, но не получалось этого - set e= не хватало
     
    Добавлено:
    king_stiven
    Спасибо вы мне очень помогли Щас это приведу в божеский вид и еще прийду за помощью...

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

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    подскажите как добавить к имени файла результаты выполнения команд date  /t и time /t
    например чтобы получилось такое имя: 'archive_16.10.2007_11.02.LOG'
    Или может быть есть какие-то спец. переменные с датой и временем?

    Всего записей: 238 | Зарегистр. 19-08-2007 | Отправлено: 11:02 16-10-2007 | Исправлено: Filosofem, 11:08 16-10-2007
    AndryG

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго дня.
    Задачка ... нужно реализовать "формочку" ...  
    "Выключение компа через N секунд. Для отмены нажмите ESC"  
     
    Единственное до чего додумался ... через Ctrl-C прерывать выполнение ... hs_readkey не подходит, ибо на нем останавливается выполнение программы.
     
    Есть еще идея запуска доп. окна, в котором ждать нажатие кнопки и создавать файлик, если нажали ...  а в основном окне мониторить время или файлик.
     
    Но тоже коряво это всё получается.
     
    Кто что подскажет?

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 11:05 16-10-2007
    01MDM



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

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    for /f "tokens=1,2 delims=." %%i in ('dir /b *.log') do (
        set "new=%%i_%date%_%time:~0,5%.%%j"
        ren %%i.%%j !new::=.!
        )
     


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



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

    Код:
    @echo off
    for /f "tokens=1-5 delims=:., " %%a in ("%date% %time:~0,6%") do echo 'archive_%%a.%%b.%%c_%%d.%%e.LOG'

    извращённый вариант:
    Код:
    @echo off
    for /f "tokens=1-5 delims=:" %%a in ("%date:~0,2%:%date:~3,2%:%date:~6,4%:%time:~0,5%") do echo 'archive_%%a.%%b.%%c_%%d.%%e.LOG'

    Добавлено:
    AndryG
    shutdown /t xxx     Задание задержки в xxx секунд перед завершением работы компьютера.
    shutdown /a         Отмена завершения работы системы.
    форму сам дорисуй как надо

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 12:14 16-10-2007 | Исправлено: Nagual, 13:05 16-10-2007
    AndryG

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nagual спасибо.
     
     Решение подходит ... стыдно, что сам не порылся в shutdown ...  
     
     Но хочу вернуться к варианту с клавиатурой ... можно ли как-то ветвление устроить по "нажата или нет кнопка" ... при этом чтобы программа не останавливалась и не ждала нажатия.

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 12:43 16-10-2007
    Tipulatoid



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

    Цитата:
    Но хочу вернуться к варианту с клавиатурой ... можно ли как-то ветвление устроить по "нажата или нет кнопка" ... при этом чтобы программа не останавливалась и не ждала нажатия.

    Вариант с двумя кнопками (например "С" и "Enter") устроит?

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не понял про две кнопки ... но не против посмотреть ...  
     
    Уточню на всяк случай ... "нечто" возвращает ноль, если буфер клавиатуры пуст (не нажимали кнопки с момента старта программы или последнего вызова этой команды) или номер нажатой кнопки.
     
    Другими словами программа не должна останавливаться на этой команде.

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 13:03 16-10-2007
    Tipulatoid



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

    Код:
    @echo off
    set timer=60
    shutdown -s -t %timer% -c "Введите C и Enter в окне командной строки для отмены" -f
     
    :again
    cls
    set choice=
    set /p choice=Введите здесь C и Enter для отмены выключения компьютера  
    if not defined choice goto again
    if /i %choice%==C (
       shutdown -a
    ) else (
       goto again
    )

     
    Выделенное жирным - время в секундах до отключения компа. Можно менять.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 13:05 16-10-2007 | Исправлено: Tipulatoid, 13:07 16-10-2007
    AndryG

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Написал ... на паскале ...  

    Код:
     
    uses crt;
    var
     ch:Char;
    begin
     if keypressed
      then begin
        ch := readkey;
        halt(ord(ch));
      end
      else halt(0);
    end.
     

     но тормозит, зараза, если по клавиатуре кулаками поклацать ... если аккуратно по одной кнопке, то работает
     
    Но вопрос открыт ... есть ли человеческое решение задачи?
     
    Добавлено:
    Tipulatoid не видел Ваш пост .. именно на такую штуку я и вышел  ... добавлю, что с утилитой hs_readkey отпадает необходимость в ENTER.
     
    В своей "утилитке" гадость поймал -- на время ее запуска в окне консоли исезает полоса прокуртки, потом появляется .. в итоге наблюдаем мерзкое моргание ... может есть тут кто из программеров "не только BAT" ...

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 13:17 16-10-2007
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AndryG
    может ты имеешь в виду это?
    немного изменил код Tipulatoid
    Код:
    @echo off
    set timer=60
    shutdown -s -t %timer% -c "Нажмите клавишу C для отмены" -f
    cls
    set choice=
    set /p choice=Нажмите клавишу C для отмены
    if /i %choice%==C (shutdown -a)

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 13:41 16-10-2007
    AndryG

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ... нет ... немного не это ... в вашем примере выполнение останавливается на  

    Код:
     
     set /p choice=Нажмите клавишу C для отмены  
     

    Я же хочу продолжать выполнение ... делать разные вещи в зависимости от "нажати ли кнопка и если да, то какая"

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 13:46 16-10-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AndryG
    Т.е. в батнике сделать 2 потока выполнения?

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 13:54 16-10-2007
    Maza Faka



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

    Код:
     
    @echo off
     
    :_again
    set /p ask_="Please respond [Y,N,Q]?"
    for %%a in (y n q) do if /i "%ask_%"=="%%a" goto _%%a
    goto _again
     
    :_y
    echo Your input was Yes& goto :EOF
     
    :_n
    echo Your input was No& goto :EOF
     
    :_q
    echo Your input was Quit& goto :EOF
    endlocal
     

     

    Цитата:

    Код:
    uses crt;  
    var  
     ch:Char;  
    begin  
     if keypressed  
      then begin  
        ch := readkey;  
        halt(ord(ch));  
      end  
      else halt(0);  
    end.
     
    но тормозит, зараза, если по клавиатуре кулаками поклацать

    Может паузу в 10 милисекунд вставить? Типа Sleep(10)

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 14:39 16-10-2007
    Filosofem

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    Nagual
    Спасибо, идею понял.  

    Всего записей: 238 | Зарегистр. 19-08-2007 | Отправлено: 14:44 16-10-2007
    AndryG

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka нет.
    Ваш код остановится на set /p ...
     
    Я же хочу такое:

    Код:
     
     
    :begin
     echo цикл ...
     readkey_ext
     if not %errorlevel%==0 if %errorlevel%==27 goto end_loop:
    goto begin
     
    :end_loop
     

    Теперь словами ... с этого цикла можно только нажав ESC (ASCII код 27) ... ReadKey_ext - утилитка, на которой не останавливается выполнение ... она не ждет нажатия... она возвращает сразу результат не было нажатия (Exit code 0) или было (Exit code - ASCII символа)
     
    У меня получилось место напоминающее написать на паскале, но глючное получилось до кошмара (описал выше моргание полосы прокрутки окна)
     
    Ладно .. забыли/забили на эту задачку ... тут другая подошла задачка
    В переменной имею кучу пар кординат, которые разделены "-" x1-y1-x2-y2-x3-y3...xn-yn
    Нужно в цикле обработать каждую пару.
     Пробовал через for /f "tokens=1,2 delims=-" ... так обратывается только первая пара ... оно и понятно ... пришлось данные (пары Xn-Yn) запихнуть в файл ... теперь, когда каждая пара в отдельной строке всё обрабатывается, но медленно! Если переделать на работу с "чисто памятью" в переменных будет ли быстрей ... если да, то как бы это сотворить?

    Всего записей: 26 | Зарегистр. 07-09-2007 | Отправлено: 15:48 16-10-2007
    Maza Faka



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

    Цитата:
    Нужно в цикле обработать каждую пару.

     
    Можно так:

    Код:
     
    @ECHO OFF
     
    SET VAR=x1-y1-x2-y2-x3-y3
     
    :BEGIN
    FOR /F "TOKENS=1* DELIMS=-" %%A IN ('ECHO %VAR%') DO (
       ECHO %%A
       IF NOT "%%B"=="" (
          SET VAR=%%B
          GOTO :BEGIN
          )
           )
     

     
    Добавлено:

    Цитата:
    Я же хочу такое:

    Как я понял вы хотите организовать бесконечный цикл, выход из которого будет осуществлён при нажатии определённой клавиши? При помощи батника сделать такое наверное можно, но нецелесообразно, так как нагрузка на процессор будет 100%, да и не предназначены батники для таких задач. Так что лучше решать подобные задачи на... например AutoIt или WSH, в них есть полноценные циклы.

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 16:24 16-10-2007
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    В коде из твоего предыдущего поста, лучше сделать "tokens=1,2*" - ему же нужно обрабатывать пары координат.

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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 21:43 16-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