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

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

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

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

vu1tur



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

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    mugil_cephalus
    я тоже как-то парился с батниками в UTF8 - нифига не работает дальше chcp 65001.
    В инете находил лишь аналогичные жалобы на то что не работает, но никаких дельных советов как заставить бат работать в UTF8 нет.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 16:38 11-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Можно, конечно, как вариант попробовать прочие разновидности UTF-8. Если чуток подождете я подробно отпишусь что я имел в виду.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 16:47 11-07-2010
    nemoW

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Вот выдача ipconfig:
    Подробнее...

    Всего записей: 113 | Зарегистр. 10-04-2007 | Отправлено: 16:55 11-07-2010 | Исправлено: nemoW, 16:57 11-07-2010
    res2001



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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set "adaptername=ADSL"
    set "num="
    for /f "tokens=1 delims=:" %%a in ('ipconfig ^| findstr /n "%adaptername%"') do set "num=%%a" & goto :step2
    :step2
    if defined num (
        set /a "num+=2"
        for /f "tokens=1,2 delims=:" %%a in ('ipconfig ^| more +!num!') do set ip=%%b & set "ip=!ip:~1!" & goto :step3
    )
    :step3
    if defined set ip

    В начале в переменной adaptername - устанавливается имя твоего соединения, на выходе в переменной ip - адрес этого соединения.
    Если имя адаптера будет найдено в выводе ipconfig, то в итоге напечатается его адрес.
     
    Добавлено:
    Исправил код

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 17:22 11-07-2010 | Исправлено: res2001, 17:29 11-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Вот накидал на скорую руку консольный обозреватель кодировок винды. Может из того, что выводит прога подойдет по сабжу UTF8.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 17:31 11-07-2010 | Исправлено: ComradG, 17:32 11-07-2010
    nemoW

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Спасибо!

    Всего записей: 113 | Зарегистр. 10-04-2007 | Отправлено: 17:45 11-07-2010
    ComradG



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Мда, судя по показаниям моей программулины UTF8 только 65001. По крайней мере на ХР.

    Всего записей: 2038 | Зарегистр. 05-07-2008 | Отправлено: 18:13 11-07-2010
    sergsdl

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте!
    У меня просьба (я только недавно начал работать с батниками, но опыт в программировании есть).
    Не могли бы Вы подсказать как в батнике реализовать следующий алгоритм действий :
    1- проверка наличия процесса (например: опера.ехе)
    2- если есть, то убить процесс
    3- если нет, то подождать 40 минут и вернуться в начало к строке 1
     
    Алгоритм в принципе простой, но я пока не разобрался с операторами в батниках, а такой батник мне очень нужен...
     
    И ещё такой алгоритм... (не сочтите за наглость... нужда заставляет)
     
    1- проверка наличия процесса (например: опера.ехе)
    2- если нет, то подождать 60 минут и вернуться в начало к строке 1
    3- если да, то перейти к строке 4
    4- проверка системного времени
    5- если время больше или равно 22.00, то убить процесс (например: опера.ехе)
    6- если нет, то подождать 60 минут и вернуться в начало к строке 1

    Всего записей: 6 | Зарегистр. 26-02-2009 | Отправлено: 23:27 11-07-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sergsdl
    Цитата:
    2- если есть, то убить процесс  
    убили, а дальше что - завершить батник или продолжить с  п.3?
    для варианта "завершить" :

    Код:
    :_loop
    tasklist | 1>nul findstr /i /b opera.exe && taskkill.exe /f /t /im opera.exe & exit
    1>nul ping localhost -n 2401
    goto :_loop

    Цитата:
    И ещё такой алгоритм...
    как-то так:
    Код:
    :_loop
    tasklist | 1>nul findstr /i /b opera.exe || goto :_wait
    if %time:~0,2% GEQ 22 taskkill.exe /f /t /im opera.exe & exit
    :_wait
    1>nul ping localhost -n 3601
    goto :loop

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 00:15 12-07-2010 | Исправлено: wolf0425, 00:16 12-07-2010
    sergsdl

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо огромное!
    Но завершать батник не надо... он должен висеть в процессах и периодически проверять наличие процесса и УБИВАТЬ его... Поэтому и нужна зацикленность...  
     
    В общем ещё раз спасибо! Буду пробовать...
     
    П.С. Не могли бы Вы поподробней обьяснить следующую строчку (что делают эти команды?) для моего ликбеза? Я понимаю что это проверка системного времени, но хотелось бы поподробней узнать принцип этих команд. (надеюсь вроде конкретно всё обьяснил ... как мог)
     
    Добавлено:
    Ой, забыл строчку вписать
     
    Вот она
     
    if %time:~0,2% GEQ 22 taskkill.exe /f /t /im opera.exe & exit  
     
    что значат эти команды
     
    %time:~0,2% (проверка времени с погрешностью?)
    GEQ 22 (вообще нигде не встречал и не знаю этой команды)
     
    остальное в этой строчке мне понятно...

    Всего записей: 6 | Зарегистр. 26-02-2009 | Отправлено: 01:07 12-07-2010
    wolf0425



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

    Цитата:
    что значат эти команды
     
    %time:~0,2% - две первых цифры текущего времени (HH:MM:SS,ss) т.е сколько часов.
    хэлп по :~0,2 - читай в set /?
     
    if %time:~0,2% GEQ 22 ... - это "если сейчас часов больше или равно 22, т.е. время 22:* или 23:* , то ... "  
    GEQ - это буквенный эквивалент  >=
    кстати, если будешь читать if /? и у тебя русские ХР - учти что в хэлпе ошибка и сравнение  == пишется буквами не EQL a EQU
     

    Цитата:
    Но завершать батник не надо...
    ну значит все  & exit   сам поубираешь...

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 04:38 12-07-2010 | Исправлено: wolf0425, 05:06 12-07-2010
    BVV63



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

    Цитата:
    То есть пробелов в пути никогда не бывает? Пример:  
    c:\12 34\1.txt 0 0\0d:\pagefile.sys 1024 2048\0e:\pagefile.sys 1024 1024

    Нет. Строго говоря, пути и имена могут быть произвольными, в том числе содержать пробелы, но в реестре должны быть короткие аналоги (кавычки не спасут), иначе не будут такие файлы подкачки работать.
     
    Добавлено:
    mugil_cephalus

    Цитата:
    у меня все работает

    Попробовал под XP, там работает (под XP команда Reg выдаёт 2 дополнительные строки сверху - свою версию и пустую строку). Под 2K3 не работает .

    Цитата:
    включи эхо

    Включено. Говорит, переменная не определена. Листинг:
    Подробнее...
    Работает лишь с More +2, но выдаёт лишь первый файл.
     
    Добавлено:
    Даже под XP Ваш код получает лишь первый файл. Первый-то файл я и сам легко могу получить (пример для 2K3, для XP Skip=4, ну или ^|Find /I "PagingFiles" - для универсальности):

    Код:
    For /F "Skip=2 Tokens=3 UseBackQ" %%A In (
        `Reg Query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /V "PagingFiles"`
        ) Do Set PagingFiles=%%A
    Set PagingFiles

    А ну как их несколько?
     
    Добавлено:
    res2001

    Цитата:
    Посмотри такой вариант

    Что-то ничего не выводит . Переменная val неопределена, printparam вроде не отрабатывает, уходит сразу на :eof.
    A Shift без параметров разве имеет какой-то смысл?
     
    Добавлено:
    Я такую конструкцию пытаюсь использовать:

    Код:
    For /F "Skip=2 Tokens=2* UseBackQ" %%A In (
        `Reg Query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /V "PagingFiles"`
        ) Do Set PagingFiles=%%B

    Но не знаю, как потом %PagingFiles% парсить.
     
    Добавлено:
    res2001
    Саму идею я понял, не знал, что в переменной можно таким образом проводить замену. Но остаются ещё числа, которые нафиг не нужны.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 06:18 12-07-2010 | Исправлено: BVV63, 08:21 12-07-2010
    res2001



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

    Цитата:
    Что-то ничего не выводит

    В цикле поставь разделителями табулятор (delims=<TAB>), у меня стоял таб, но видимо форумный движок его заменил на пробелы.
    Должно работать.
     
    Добавлено:

    Цитата:
    Саму идею я понял, не знал, что в переменной можно таким образом проводить замену. Но остаются ещё числа, которые нафиг не нужны.


    Код:
    @echo off
    setlocal enabledelayedexpansion
    for /f "tokens=3 delims=    " %%a in ('reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /v PagingFiles ^| findstr "PagingFile"') do (  
        set "val=%%a"
        set "val=^"!val:\0=^" ^"!^""
        call :printparam !val!
    )
    goto:eof
     
    :printparam
    if "%~1" equ "" exit /b
    for /f "tokens=1" %%b in ("%~1") do echo.%%b
    shift
    goto :printparam

    Ну и про табулятор не забудь в первом цикле.

    Цитата:
    A Shift без параметров разве имеет какой-то смысл?  

    дык shift /? читал? Изначально, еще в ДОСе в shifte не было параметра. Параметр не обязателен. Без параметра будет эквивалент shift /0.
     
    Добавлено:

    Цитата:
    не знал, что в переменной можно таким образом проводить замену

    про замену в set /? написано.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 08:26 12-07-2010 | Исправлено: res2001, 08:33 12-07-2010
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Усё, написал наконец-то. Уфф... Большое спасибо всем за помощь. Помогла замена \0 на пробел. Получился такой вариант:

    Код:
    ClS
    SetLocal EnableDelayedExpansion
    For /F "Skip=2 Tokens=2* UseBackQ" %%A In (
        `Reg Query "HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management" /V "PagingFiles"`
        ) Do (
        Set Files=%%B
        )
    Echo %Files%
    Set Files=%Files:\0= %
    Echo %Files%
    For %%A In (%Files%) Do (
        If %%A GEq A (
            Set PagingFiles=!PagingFiles! %%A)
            )
        )
    Echo %PagingFiles%

     
    Добавлено:
    res2001
    А что делает Delims= ? Т. е. без параметров?

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 09:10 12-07-2010 | Исправлено: BVV63, 09:17 12-07-2010
    res2001



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

    Цитата:
    А что делает Delims= ? Т. е. без параметров?

    Очень даже с параметрами - у меня после равно стоит символ табуляции.
    А без параметров - будет то же самое что и tokens=* - т.е. в переменную присвоится вся строка.

    Цитата:
    Усё, написал наконец-то.

    Ну еще на последок убери из переменной PagingFiles первый пробел:
    Echo %PagingFiles:~1%  
     
     
    Добавлено:
    Кстати: а отрабатывает ли твой скрипт в случае нескольких pagingfiles?  
    Что-то мне подсказывает, что нет

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 09:33 12-07-2010
    BVV63



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

    Цитата:
    Кстати: а отрабатывает ли твой скрипт в случае нескольких pagingfiles?

    Да нет, работает. Специально 3 штуки в реестре прописал, для проверки.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 09:43 12-07-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    BVV63
    Странно, а у меня не отрабатывает твой код на нескольких файлах.
     
    Добавлено:
    аа, нет, срабатывает, сори, сам дурак

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 09:55 12-07-2010
    mugil_cephalus

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

    Цитата:
    А без параметров - будет то же самое что и tokens=* - т.е. в переменную присвоится вся строка.  

    http://forum.ru-board.com/topic.cgi?forum=62&topic=19668&start=1140#16

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 13:06 12-07-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    mugil_cephalus
    Верно, спс. за наводку, в случае с token=* разделить не пустой, поэтому начальные разделители отбрасываются.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 13:19 12-07-2010
    mugil_cephalus

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

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

    надеяюсь только на время сеанса, не в рееестре же прописывается...

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 13:25 12-07-2010
       

    Страницы: 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru