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

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    господа, такая задача:
    есть два текстовых файла
    1.txt:
    1_111
    2_111
    3_111
     
    2.txt:
    1_222
    2_222
    3_222
     
    надо записать их содержимое в третий файл построчно, чтобы получилось
    3.txt:
    1_111
    1_222
    2_111
    2_222
    3_111
    3_222

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 10:52 03-05-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mark_Titov
    Цитата:
    ...слушай, а где можно убрать эту команду (не нашел) -  
    проще всего было паузу в последней строчке убрать, тогда сразу после того как нарисует вывод -  ушло бы на очистку экрана.
     

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

    наверно все же не код выполнять на удаленной машине, а сервисы проверять на удаленной машине??
    во все команды sc
    держи, вывод тоже убрал, и постоянную паузу после управления заменил на секундную
     

    Код:
    @echo off
    setlocal enabledelayedexpansion
     
    set server=\\servername
     
    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 | find /i "Windows" 1>nul && (
            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_=%%b            "
            echo.%%a !_displ_:~0,12!    %%s    !_serviced_%%a!
        )
    )
    echo.  
    title Select
    set "reply=0"
    set /p reply="Please select number for start/stop and press Enter (0=rescan): "
    set "reply=00%reply: =%"
    set "reply=%reply:~-2%"
    if %reply% == 00 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

     
    Добавлено:
    Nagual
    Цитата:
    господа, такая задача:  

    почитай форум в районе 10-03-2010  - делали там для sergij такую склейку, только там клеили в одну строку и файлов склеивали поначалу три, но отрезать то лишнее легко...
     
    только тогда в итоге оказалось что нужна была вовсе не склейка...

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



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

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

    ...Ты прав. Но почему после того как паузу снимаю, останавливаю службу, потом снова запускаю ее - он через раз практически пишет не RUNUNG, а -
     

    Код:
     
    01 AudioSrv        START_PENDING    Windows Audio
    02 MSIServer       STOPPED    Windows Installer
     

    ???...
    Когда останавливаю - нормально статус отображает как видишь...
     

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

    Ну да, запускать/останавливать на удаленном компе нужно, ну и просматривать это есстетвенно...
     
    А имя компа на котором эти сервисы запускать/останавливать тут вписывать я так понимаю?

    Код:
     
    sc %COMP_NAME% query !_service_%reply%!  
     

    Правильно?

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 12:19 03-05-2010 | Исправлено: Mark_Titov, 13:26 03-05-2010
    01MDM



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

    Код:
     
    @echo off
    setlocal
     
    for /f %%i in ('type 1.txt ^| find /c /v ""') do set "num1=%%i"
    for /f %%i in ('type 2.txt ^| find /c /v ""') do set "num2=%%i"
     
    if %num1% gtr %num2% (set num=%num1%) else (set num=%num2%)
     
    for /l %%i in (0,1,%num%) do call:write %%i
    goto:eof
     
    :write
     
    for /f "tokens=*" %%i in ('more +%1 1.txt') do echo %%i & goto:next
    :next
    for /f "tokens=*" %%i in ('more +%1 2.txt') do echo %%i & goto:eof
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 12:22 03-05-2010
    NIKZZZZ



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

    Цитата:
    господа, такая задача:
    есть два текстовых файла  


    Код:
    2>3.txt echo.
    set /a count=0
    FOR /F "tokens=* delims=" %%i in (1.txt) do (
      >>3.txt echo %%i
      call :_1
    )
    goto :eof
     
    :_1
    if %count%==0 (
      FOR /F "tokens=* delims=" %%j in (2.txt) do (
        >>3.txt echo %%j
        set /a count+=1
        goto :eof
      )
    ) else (
     
      FOR /F "skip=%count% tokens=* delims=" %%j in (2.txt) do (
        >>3.txt echo %%j
        set /a count+=1
        goto :eof
      )
    )
    goto :eof

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 12:42 03-05-2010 | Исправлено: NIKZZZZ, 12:44 03-05-2010
    wolf0425



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

    Цитата:
    ...Ты прав. Но почему он после того как паузу снимаю он через раз практически пишет не RUNUNG, а START_PENDING  
    это потому что сервис еще не RUNUNG, а находится в процессе старта на момент проверки его состояния.
    В поправленном варианте - после команды смены статуса вписана пауза 1000 миллисекунд (через пинг), мне хватает чтоб PENDING не выскакивал. если твоим сервисам не хватает - увеличь её. но проще юзеру нажать enter чтоб обновило список.  
    Если очень надо - можно для случая наличия PENDING у какого-то сервиса вписать ожидание и перескан, но все же лучше юзера подрессировать.
     

    Цитата:
    А имя компа на котором эти сервисы запускать/останавливать тут вписывать я так понимаю?
    ну да, вписал же в новую версию подержку удаленного компа:
    set server=\\servername
    Ну или можешь вписать чтоб как параметр в батник передавать, из ярлыка
     

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

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



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Слушай, сильно сделано спасибо, нет слов просто.
    Я бы ни зачто не справился бы.
     
    Проблемка теперь встала блин...
    Теперь мой сервис когда я останавливаю - он прекрасно останавливается в оснастке "SERVICES", а вот в процессах все равно висит и выполняется пока не перезагрузишь сервак. Я там в "Тип запуска" выставил им "MANUAL" и только после перезагрузки остановленный сервис перестает работать. Понимаю что это из-за того что сами сервисы самопальные и лежат в виде фалов exe на диске С. Они просто прикрученны в "SERVICES" утилитой "Any Service".
    Конечно наверное проще будет после остановки сервиса дописать команду на принудительную перезагрузку сервака - но может можно как-нибудь командой "TASKILL" прибивать тот сервис который был остановлен по тому же принципу что и запуск/остановка самого сервиса?
     
    И еще -
    Когда сервак выключен или не доступен куда добавить надпись "СЕРВЕР НЕ ДОСТУПЕН" в место того что он пишет при не доступности сервака -
     

    Код:
     
    Переменная среды _service_ не определена
     
    Please select number for start/stop and press Enter (0=RETURN TO MENU):
     

     
    ...а то юзер не поймет что от него требуется и почему не работают кнопочки )).
    Уже думал что может в самом начале пинг на него разок поставить и при отсутствии такового в данной консоли он и будет писать - "СЕРВЕР НЕ ДОСТУПЕН" (только на инглиш, винда буржуйская - chcp 1251 ставлю в начало батника - не помогает) и далее пауза а после нажатия anykey закрывать свое окно. Может так проще? Или есть проще/лучше варианты?

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 14:27 03-05-2010 | Исправлено: Mark_Titov, 15:09 03-05-2010
    king_stiven

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

    Код:
    for /f "tokens=*" %%e in (1.txt) do (
        echo %%e>>3.txt
        if defined sum set skp=skip=
        call :yu
        set /a sum+=1
    )
    goto :eof
    :yu
    for /f "tokens=* %skp%%sum%" %%d in (2.txt) do (
        echo %%d>>3.txt
        goto kl
    )
    :kl

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 15:34 03-05-2010
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    протестировал, немного не годится вариант, так как не обрабатывает все символы
    NIKZZZZ
    твой вариант вполне работоспособен, хотя и немного долго работает на больших файлах, спасибо
    только непонятно, зачем добавлять параметр tokens=*
    king_stiven
    вариант NIKZZZZ оказался более предпочтительным, так как на двух файлах общим размером 82,6 КБ время обработки составило Time: 4.839
    против твоего Time: 11.881, хотя сам код намного компактнее

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 15:55 03-05-2010 | Исправлено: Nagual, 16:17 03-05-2010
    NIKZZZZ



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

    Цитата:
    зачем добавлять параметр tokens=*

    Перестраховался, вполне достаточно "delims=" , но если строка содержит пробелы или другие спец. символы, хуже не будет. А скорость - батники не умеют параллельно  работать более чем с одним файлом.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 16:28 03-05-2010
    wolf0425



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

    Цитата:
    Когда сервак выключен или не доступен куда добавить надпись "СЕРВЕР НЕ ДОСТУПЕН" в место того что он пишет при не доступности сервака -  

    добавь после задания имени сервера  

    Код:
    1>nul 2>nul ping -n 1  %server:~2% || (echo no respond from %server:~2%, exiting... & pause & exit)

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:46 03-05-2010 | Исправлено: wolf0425, 17:06 03-05-2010
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    хм, ни разу не встречал ошибок при работе параметра "delims="
    он как раз и обозначает что берётся вся строка целиком без каких-либо разделителей
    если есть пример, приведи, интересно будет взглянуть

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 16:55 03-05-2010
    wolf0425



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

    Цитата:
    Понимаю что это из-за того что сами сервисы самопальные и лежат в виде фалов exe на диске С. Они просто прикрученны в "SERVICES" утилитой "Any Service".
    Конечно наверное проще будет после остановки сервиса дописать команду на принудительную перезагрузку сервака - но может можно как-нибудь командой "TASKILL" прибивать тот сервис который был остановлен по тому же принципу что и запуск/остановка самого сервиса?  
    ну так попробуй прибить, расскажешь что получится.
    taskkill.exe /f /t /im superservice.exe
     
    но потенциально это глючно - у тебя же сервер на самом деле не остановлен, раз "вот в процессах все равно висит и выполняется" (надеюсь ты не просто от наличия в списке процессов так написал)

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 16:58 03-05-2010
    Mark_Titov



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

    Код:
     
    setlocal enabledelayedexpansion
    set server=\\user
    1>nul 2>nul ping -n 1  %server:~2% || (echo no respod from %server:~2%, exiting... & pause & exit)
     

     
    ...не хочет - (скопированно прямо с окна)
     

    Код:
     
    Обмен пакетами с user [::1] по 32 байт:
     
    Ответ от ::1: время<1мс
     
    Статистика Ping для ::1:
        Пакетов: отправлено = 1, получено = 1, потеряно = 0 (0% потерь),
    Приблизительное время приема-передачи в мс:
        Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек
    Для продолжения нажмите любую клавишу . . .
     

     
    ...где грабли-то?

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



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

    Цитата:
    хм, ни разу не встречал ошибок при работе параметра "delims="

    "delims=" отличается от "tokens=*" тем, что второй съедает пробелы/табудяции из начала строки.

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



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

    Цитата:
    ну так попробуй прибить, расскажешь что получится.  
    taskkill.exe /f /t /im superservice.exe

    Я так понимаю что "superservice.exe" это имя моего сервиса?
    Если да, то это понятно, это что называется "в ручную". Это мой старый вариант - он работает. Но суть в том что при добавлении пингуемых компов - соответственно сервисов этот батник прийдется дописывать/изменять и подгонять... Потому я и спрашиваю может можно так же как с сервисами через переменные прибивать тот процесс сервис которого останавливается! Другими словами, сервис остановился- далее прописанна некая команда с переменными которая определяет какой сервис был остановлен в данный момент и выполняет удаление процесса с винды... Может круто конечно, не спорю - но сюдя по тому что ты уже сделал, думаю что круче просто нет...

    Всего записей: 387 | Зарегистр. 12-04-2010 | Отправлено: 17:13 03-05-2010
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    ок, никогда не замечал, взял на заметку, как чувствовал, что "delims=" все таки предпочтительнее ставить

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 17:14 03-05-2010
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mark_Titov чудеса у тебя какие-то, ладно бы просто не работало - так на экране пишет, хотя ясно написано в нуль писать.
    у меня всё работает с правильным компом и выбрасывает с неправильным...
    какая хоть ОС? и это... пинг то родной, никто не подменил?
    попробуй так, что-ли

    Код:
    set server=\\127.0.0.1
    ping.exe -n 1  %server:~2% 1>nul 2>nul || ( echo no respond from %server:~2%, exiting... & pause & exit )  


    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 17:15 03-05-2010
    Mark_Titov



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

    Цитата:
    Mark_Titov чудеса у тебя какие-то,

    ...все, сработало, спасибо. Соединения 2 активных было - одно отключил - пошло.
    А с процессами получится так как выше я описал?

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Mark_Titov по поводу anyserv.exe - разбирайся с ним и со своей программой, у меня запущенный через него экзешник без проблем исчезает/появляется в списке процессов по sc stop/sc start (пускал Small HTTP server)

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 17:52 03-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