Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 8

Автор: Mark_Titov
Дата сообщения: 03.05.2010 07:27
wolf0425 - ВОТ ЭТО ДА! ЭТО ВЫШЕ ВСЕХ ПОХВАЛ... ОГРОМНОЕ ТЕБЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!
РЕСПЕКТ И УВАЖУХА! Я НЕ ДУМАЛ ЧТО ВСЕ ЭТО ТАК МОЖНО РЕАЛИЗОВАТЬ. ПРЕКЛОНЯЮСЬ ПЕРЕД ТВОИМ МАСТЕРСТВОМ, ЧЕСТНОЕ СЛОВО - СПАСИБО! БЛАГОДАРЮ ЗА ТВОЕ ТЕРПЕНИЕ И ТРУД!

С УВАЖЕНИЕМ...

Add

...слушай, а где можно убрать эту команду (не нашел) -


Код:
SERVICE_NAME: AudioSrv
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 3 STOP_PENDING
(STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x2
WAIT_HINT : 0x0
Автор: 01MDM
Дата сообщения: 03.05.2010 09:28
melboyscout

Цитата:
if "%4.%mm:~-2%.%2"=="%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%"

Зачем? просто %date%
Автор: Nagual
Дата сообщения: 03.05.2010 09:52
господа, такая задача:
есть два текстовых файла
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
Автор: wolf0425
Дата сообщения: 03.05.2010 10:23
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
Автор: Mark_Titov
Дата сообщения: 03.05.2010 11:19

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

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


Код:
01 AudioSrv START_PENDING Windows Audio
02 MSIServer STOPPED Windows Installer
Автор: 01MDM
Дата сообщения: 03.05.2010 11:22
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
Автор: NIKZZZZ
Дата сообщения: 03.05.2010 11:42
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
Автор: wolf0425
Дата сообщения: 03.05.2010 12:25

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


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


Цитата:
Ну да, запускать/останавливать на удаленном компе нужно
так вот именно выполнять какие-то команды на удаленной машине - тоже можно, но это другое и для управления сервисами это вроде незачем.
Автор: Mark_Titov
Дата сообщения: 03.05.2010 13:27
wolf0425
Слушай, сильно сделано спасибо, нет слов просто.
Я бы ни зачто не справился бы.

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

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


Код:
Переменная среды _service_ не определена

Please select number for start/stop and press Enter (0=RETURN TO MENU):
Автор: king_stiven
Дата сообщения: 03.05.2010 14:34
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
Автор: Nagual
Дата сообщения: 03.05.2010 14:55
wolf0425
протестировал, немного не годится вариант, так как не обрабатывает все символы
NIKZZZZ
твой вариант вполне работоспособен, хотя и немного долго работает на больших файлах, спасибо
только непонятно, зачем добавлять параметр tokens=*
king_stiven
вариант NIKZZZZ оказался более предпочтительным, так как на двух файлах общим размером 82,6 КБ время обработки составило Time: 4.839
против твоего Time: 11.881, хотя сам код намного компактнее
Автор: NIKZZZZ
Дата сообщения: 03.05.2010 15:28
Nagual

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

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

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

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

Код: 1>nul 2>nul ping -n 1 %server:~2% || (echo no respond from %server:~2%, exiting... & pause & exit)
Автор: Nagual
Дата сообщения: 03.05.2010 15:55
NIKZZZZ
хм, ни разу не встречал ошибок при работе параметра "delims="
он как раз и обозначает что берётся вся строка целиком без каких-либо разделителей
если есть пример, приведи, интересно будет взглянуть
Автор: wolf0425
Дата сообщения: 03.05.2010 15:58

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

но потенциально это глючно - у тебя же сервер на самом деле не остановлен, раз "вот в процессах все равно висит и выполняется" (надеюсь ты не просто от наличия в списке процессов так написал)
Автор: Mark_Titov
Дата сообщения: 03.05.2010 16:02
...вставил сюда-


Код:
setlocal enabledelayedexpansion
set server=\\user
1>nul 2>nul ping -n 1 %server:~2% || (echo no respod from %server:~2%, exiting... & pause & exit)
Автор: wolf0425
Дата сообщения: 03.05.2010 16:03

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

"delims=" отличается от "tokens=*" тем, что второй съедает пробелы/табудяции из начала строки.
Автор: Mark_Titov
Дата сообщения: 03.05.2010 16:13

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

Я так понимаю что "superservice.exe" это имя моего сервиса?
Если да, то это понятно, это что называется "в ручную". Это мой старый вариант - он работает. Но суть в том что при добавлении пингуемых компов - соответственно сервисов этот батник прийдется дописывать/изменять и подгонять... Потому я и спрашиваю может можно так же как с сервисами через переменные прибивать тот процесс сервис которого останавливается! Другими словами, сервис остановился- далее прописанна некая команда с переменными которая определяет какой сервис был остановлен в данный момент и выполняет удаление процесса с винды... Может круто конечно, не спорю - но сюдя по тому что ты уже сделал, думаю что круче просто нет...
Автор: Nagual
Дата сообщения: 03.05.2010 16:14
wolf0425
ок, никогда не замечал, взял на заметку, как чувствовал, что "delims=" все таки предпочтительнее ставить
Автор: wolf0425
Дата сообщения: 03.05.2010 16:15
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 )
Автор: Mark_Titov
Дата сообщения: 03.05.2010 16:33

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

...все, сработало, спасибо. Соединения 2 активных было - одно отключил - пошло.
А с процессами получится так как выше я описал?
Автор: wolf0425
Дата сообщения: 03.05.2010 16:52
Mark_Titov по поводу anyserv.exe - разбирайся с ним и со своей программой, у меня запущенный через него экзешник без проблем исчезает/появляется в списке процессов по sc stop/sc start (пускал Small HTTP server)
Автор: Mark_Titov
Дата сообщения: 03.05.2010 19:31
wolf0425 Хорошо, буду разбираться с этим.

Еще одна просьба к тебе. Можно выровнять отображение статуса сервисов?
Я убрал отображение самих сервисов, оставил только отображение "SERVICE_NAME" потому как и то и другое у меня одинаково называется, не зачем 2 раза отображать это.
А вот выровнять статусы не получается - помоги, что я не так делаю?

вот что получается -


Код:
01 Windows Audio RUNNING
02 Windows Installer STOPPED
Автор: wolf0425
Дата сообщения: 03.05.2010 20:14

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

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

Код:     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
    )
Автор: Mark_Titov
Дата сообщения: 03.05.2010 20:28

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

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


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

Супер - Спасибо тебе огромное. Не знаю как бы я выкручивался. Респект тебе!

А с остановкой одноименных процессов буду ковыряться... Пока не получается. Наверное в конец кода принудительный перезагруз ставить буду если не получится так же процессы принудительно выгружать как ты это с сервисами реализовал...

Благодарю еще раз...
С уважением!

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


Код:
@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
Автор: wolf0425
Дата сообщения: 03.05.2010 22:56

Цитата:
Наверное в конец кода принудительный перезагруз ставить буду если не получится так же процессы принудительно выгружать как ты это с сервисами реализовал...
да влепи проверку на наличие .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
Автор: Mark_Titov
Дата сообщения: 03.05.2010 23:06

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

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


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

...нет с .exe


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

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

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


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

а странно


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

а ты операции с неполным списком - на ней же проверял?
sc query >file.txt, файл сюда, только в [ more][ code][ /code][ /more] заключи
ну или сам посмотри все ключевые слова, которые ищутся батником.
русской винды или русского sc у меня под руками нет...
Автор: user5nov
Дата сообщения: 04.05.2010 11:30
Скрипт подсчитывает но числа ставить несоизмеримо огромные.
Счем это может быть связанно ?
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 сервер нехочет.
Автор: NIKZZZZ
Дата сообщения: 04.05.2010 11:53
user5nov

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

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

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

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

Предыдущая тема: XP не видит второй раздел на съемном USB-HDD


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.