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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425 Хорошо, буду разбираться с этим.
     
    Еще одна просьба к тебе. Можно выровнять отображение статуса сервисов?
    Я убрал отображение самих сервисов, оставил только отображение "SERVICE_NAME" потому как и то и другое у меня одинаково называется, не зачем 2 раза отображать это.
    А вот выровнять статусы не получается - помоги, что я не так делаю?
     
    вот что получается -
     

    Код:
     
    01 Windows Audio    RUNNING
    02 Windows Installer    STOPPED
     

    Хотелось что бы не зависимо от длинны в названии сервиса статусы не сдвигались (ниже пример)-
     

    Код:
     
    01 Windows Audio             RUNNING
    02 Windows Installer         STOPPED
     

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 20:31 03-05-2010 | Исправлено: Mark_Titov, 20:44 03-05-2010
    wolf0425



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

    Цитата:
    А вот выровнять статусы не получается - помоги, что я не так делаю?  
    ты когда такие вопросы задаешь - код то проблемного места приводи, телепаты в отпуске, угадывать как конкретно ты накосячил никому не надо.
     
    выравнивание там было сделано, надо было только заменить что отображать и ширину поля увеличить.
    примерно так:

    Код:
        for /f "tokens=4" %%s in ('sc %server% query %%b ^| findstr /r /b /c:" *STATE " ') do (
            set "_displ_=!_serviced_%%a!                                                "
            echo.%%a !_displ_:~0,48! %%s
        )

    отображаются первые 48 символов DISPLAY_NAME, при нехватке добивается пробелами.
    если надо другое ограничение - поправишь.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 21:14 03-05-2010 | Исправлено: wolf0425, 21:20 03-05-2010
    Mark_Titov



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

    Цитата:
    ты когда такие вопросы задаешь - код то проблемного места приводи, телепаты в отпуске.

    ...да, действительно - извиняюсь ))
     

    Цитата:
    примерно так:

    Супер - Спасибо тебе огромное. Не знаю как бы я выкручивался. Респект тебе!
     
    А с остановкой одноименных процессов буду ковыряться... Пока не получается. Наверное в конец кода принудительный перезагруз ставить буду если не получится так же процессы принудительно выгружать как ты это с сервисами реализовал...
     
    Благодарю еще раз...
    С уважением!
     
    Добавлено:
    ...Прикольно. Хочу как дополнительную опцию прикрутить - вывод всех сервисов на этом серваке -
     

    Код:
     
    @echo off
    echo.
    setlocal enabledelayedexpansion
    set server=\\user
    ping -n 1  %server:~2% 1>nul 2>nul || ( echo NO RESPOND FROM SERVER, EXITING... & pause & exit )  
    title Scanning
    set "sernum=100"
    for /f "tokens=1*" %%a in ('sc %server% query state^= all') do (
    if /i .%%a equ .SERVICE_NAME: set "_servicen_=%%b" && title Scanning %server%: %%b
    if /i .%%a equ .DISPLAY_NAME: echo %%b && (
    echo %%b
    set /a sernum += 1
    set "_service_!sernum:~1!=!_servicen_!"
    set "_serviced_!sernum:~1!=%%b"
    )
    )
    cls
    for /f "tokens=2,3* delims=_=" %%a in ('set _service_') do (  
    for /f "tokens=4" %%s in ('sc %server% query %%b ^| findstr /r /b /c:" *STATE " ') do (  
    set "_displ_=!_serviced_%%a!                                                "  
    echo.%%a !_displ_:~0,48! %%s  
    )
    )  
    echo.    
    title Please select number for start/stop and press Enter  
    set "reply=0"  
    set /p reply="Please select number for start/stop and press Enter (0=RETURN TO MENU): "  
    set "reply=00%reply: =%"  
    set "reply=%reply:~-2%"  
    if %reply% == 00 goto :_menu
    if not defined _service_%reply% echo Service %reply% not defined & pause & exit  
    sc %server% query !_service_%reply%! | findstr /r /b /c:" *STATE " | 1>nul find "RUNNING" && 1>nul sc %server% stop !_service_%reply%! || 1>nul sc %server% start !_service_%reply%!  
    1>nul 2>&1 ping -n 1 -w 1000 127.255.255.255  
    pause
     

    ...а он не все "DISPLAY_NAME" пишет (их там много, это кусок)-

    Код:
     
    01                                                  RUNNING
    02                                                  STOPPED
    03                                                  RUNNING
    04                                                  STOPPED
    05 Windows Audio                           RUNNING
    06 Kaspersky Anti-Virus                   RUNNING
    07                                                  RUNNING
    08 BlueSoleilCS                               RUNNING
    09                                                  STOPPED
    10 BsHelpCS                                   RUNNING
    11 BsMobileCS                                RUNNING
    12 Bluetooth Support Service           RUNNING
    13                                                  STOPPED
    14                                                  STOPPED
    15                                                  STOPPED
    16                                                  RUNNING
    17                                                  RUNNING
    18 DHCP-                                        RUNNING
    19                                                  STOPPED
    20                                                  STOPPED
    21 DNS-                                          RUNNING
    22                                                  STOPPED
    23                                                  STOPPED
    24                                                  STOPPED
    25                                                  RUNNING
     

    ...в чем прикол?  

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 21:28 03-05-2010 | Исправлено: Mark_Titov, 22:36 03-05-2010
    wolf0425



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

    Цитата:
    Наверное в конец кода принудительный перезагруз ставить буду если не получится так же процессы принудительно выгружать как ты это с сервисами реализовал...  
    да влепи проверку на наличие .exe в имени сервиса, и если есть - вместо sc stop вызови тасккилл.  
    или ты через anyserv прописываешь имена без .exe ??
     

    Цитата:
    Хочу как дополнительную опцию прикрутить - вывод всех сервисов на этом серваке
    ...в чем прикол?  

    1. в коде вылезла бага, вызывающая сбои при обработке сервисов, где есть пробелы в имени.  
    2. код не расчитан на 100+ сервисов. если надо все - надо надо переводить на трехзначный счетчик: не знаю как у тебя, а у меня их больше 100.
     
    держи, надеюсь поправил.
     

    Код:
    @echo off
    setlocal enabledelayedexpansion
     
    set server=\\127.0.0.1
    ping -n 1  %server:~2% 1>nul 2>nul || ( echo no respond from %server:~2%, exiting... & pause & exit )  
     
    title Scanning
    set "sernum=1000"
    for /f "tokens=1*" %%a in ('sc %server% query state^= all') do (
        if /i .%%a equ .SERVICE_NAME: set "_servicen_=%%b" && title Scanning %server%: %%b
        if /i .%%a equ .DISPLAY_NAME: (
            echo %%b
            set /a sernum += 1
            set "_service_!sernum:~1!=!_servicen_!"
            set "_serviced_!sernum:~1!=%%b"
        )
    )
     
    :display
    title Display
    cls
    for /f "tokens=2,3* delims=_=" %%a in ('set _service_') do (
        for /f "tokens=4" %%s in ('sc %server% query "%%b" ^| findstr /r /b /c:" *STATE " ') do (
            set "_displ_=!_serviced_%%a!                                                                        "
            echo.%%a !_displ_:~0,60! %%s
        )
    )
    echo.  
    title Select
    set "reply=0"
    set /p reply="Please select number for start/stop and press Enter (0=rescan): "
    set "reply=000%reply: =%"
    set "reply=%reply:~-3%"
    if %reply% == 000 goto :display
    if not defined _service_%reply% echo Service %reply% not defined & pause & exit
     
    sc %server% query "!_service_%reply%!" | findstr /r /b /c:" *STATE " | 1>nul find "RUNNING" && 1>nul sc %server% stop "!_service_%reply%!" || 1>nul sc %server% start "!_service_%reply%!"  
    1>nul 2>&1 ping -n 1 -w 1000 127.255.255.255
    goto :display


    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 23:56 03-05-2010 | Исправлено: wolf0425, 23:59 03-05-2010
    Mark_Titov



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

    Цитата:
    держи, поправил.

    ...то же самое.
    Но должен сказать этот код на русской винде проверяю - может из-за этого?
     

    Цитата:
    или ты через anyserv прописываешь имена без .exe ??

    ...нет с .exe
     

    Цитата:
    да влепи проверку на наличие .exe в имени сервиса, и если есть - вместо sc stop вызови тасккилл.  

    ...так я про ПРОЦЕССЫ же говорю. Может не правильно выразился - извиняюсь...
    Сервис остановлен - а ПРОЦЕСС висит еще и мало того пинги так и продолжают идти - приходится перезагружать сервак после остановки каждого сервиса...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 00:06 04-05-2010 | Исправлено: Mark_Titov, 00:10 04-05-2010
    wolf0425



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

    Цитата:
    Сервис остановлен - а ПРОЦЕСС висит еще  
    так я и говорю - посте того как скомандовал серверу остановиться, если последние 4 символа имени процесса  .exe - ещё и тасккиллом прибить одноименный процесс. Чего мудрить то.
    но у меня http.exe вполне сам закрывался по команде остановке сервера, тормозил только на старте.
     

    Цитата:
    ...то же самое.  

    а странно
     

    Цитата:
    Но должен сказать этот код на русской винде проверяю - может из-за этого?  

    а ты операции с неполным списком - на ней же проверял?
    sc query >file.txt, файл сюда, только в [ more][ code][ /code][ /more] заключи
    ну или сам посмотри все ключевые слова, которые ищутся батником.
    русской винды или русского sc у меня под руками нет...

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 02:40 04-05-2010 | Исправлено: wolf0425, 02:47 04-05-2010
    user5nov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скрипт подсчитывает но числа ставить несоизмеримо огромные.
    Счем это может быть связанно ?
    cmd выглядит так:
    for /f "tokens=3" %%a in ('dir /s/a-d "c:\Новая папка\*" ^| findstr /r /b /c:"^[0-9]*"') do set sizetxt=%%a
    1>>file.txt echo %sizetxt: =% bytes
    В этой папке 1 файл на 32 килобайта
    а результат в file.txt такой:
     
    5 953 449 984 bytes
     
     
    И ещё,скрипт в XP хоть и отрабатывается неправильно , но числа показывает. А в 2003 сервер нехочет.

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 12:30 04-05-2010 | Исправлено: user5nov, 12:39 04-05-2010
    NIKZZZZ



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

    Цитата:
    Счем это может быть связанно ?  

    Условию поиска findstr удовлетворяет последняя строка команды dir

    Код:
                   0 папок   5 953 449 984 байт свободно  

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 12:53 04-05-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    user5nov
    Сформулируй вопрос, что тебе надо. Если твой скрипт слишком лажовый, проще писать новый. чем исправлять.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 12:57 04-05-2010
    user5nov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    вложенность такая: c:\Новая папка\5\файл.exe размером в 32 килобайта
     
    Добавлено:
    king_stiven
    Подсчет объёма в папке и подпапке с выводом объема в текстовый файл.  
    Вложенность фалов и папок огромная, преимущественно русские буквы файлов и папок.
    Вывод текстового файла должен перезаписываться.

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 13:15 04-05-2010
    king_stiven

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

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 13:23 04-05-2010
    user5nov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    ходил, даж помогли написать скрипт этот. на 56 странице.

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 13:40 04-05-2010
    wolf0425



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

    Цитата:
    Подсчет объёма в папке и подпапке с выводом объема в текстовый файл.  
    для английской винды:

    Код:
    for /f "tokens=3" %%a in ('dir /s/a-d .\* ^| findstr /r /b /c:"^[ 0-9]*File(s)"') do set sizetxt=%%a
    1>file.txt echo %sizetxt: =%
    для русской перепишешь сам.
    если надо автонастройку на язык - можно попробовать поизвращаться, но попозже.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:44 04-05-2010 | Исправлено: wolf0425, 13:52 04-05-2010
    user5nov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Честно, немогу понять, неработет и фсё.

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 13:51 04-05-2010
    wolf0425



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

    Цитата:
    неработет и фсё.
    я тебе что- телепат?  
    чего не работает?  
    винда у тебя английская или русская?
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 13:53 04-05-2010
    user5nov

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

    Цитата:
    для русской перепишешь сам.  
     

    да, это без проблем
    но таж на англ не пашет у меня, мож с виндой проблема?
     
    Добавлено:
    wolf0425
    нет конечно не телепат, не пашет написал про скрипт, вывод цифр в файл не производит.
    Винда русская

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 13:54 04-05-2010
    wolf0425



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

    Цитата:
    не пашет написал про скрипт
    а что именно не делает и что собственно делает - мне у гадалки выяснять?
     
    проверяем ещё раз, винда пофиг какая.

    Код:
    for /f "tokens=3*" %%a in ('dir "%~f0"') do set "dir_txt=%%b"  
    for /f "tokens=3"  %%s in ('dir /s/a-d .\* ^| findstr /b /c:" " ^| find /v "%dir_txt%" ') do set "dir_txt=%%s"
    for /f "delims=0123456789" %%a in ("%dir_txt%") do call set "dir_txt=%%dir_txt:%%a=%%"
    1>>file.txt echo %dir_txt%
     

     
     
     

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:09 04-05-2010 | Исправлено: wolf0425, 14:41 04-05-2010
    user5nov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Размер в файл вывелось.
    Этот размер того что находилось в папке где я запускал файл ?

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 14:14 04-05-2010
    wolf0425



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

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

    да, .\*, с подкаталогами включая скрытые файлы.
    ps: ключики в коде ещё подрихтовал

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:16 04-05-2010 | Исправлено: wolf0425, 14:19 04-05-2010
    user5nov

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В XP всё впорядке.
     
    На Вынь 2003 выводится размер, но с проблемами, где должны находится проблемы в файле создаются буква "я" тобишь так: 5я678я788 и т.д.
    Это если сделать так: ./*
    На XP этих букав нет.

    Всего записей: 112 | Зарегистр. 19-10-2005 | Отправлено: 14:25 04-05-2010 | Исправлено: user5nov, 14:28 04-05-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