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

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

Автор: Mark_Titov
Дата сообщения: 30.04.2010 10:14
Да.

Типа - sc start\stop 00-80-9F-..-..-.. .exe >nul (на удаленной машине - в локалке)

Цитата:
и в вывод нужно получить только эти 10 служб, отсеев другие?

Да. Отфильтровать только их...
Цитата:
а почему нельзя их фильтровать не по имени екзешника, а по SERVICE_NAME - ???

Можно и по имени сервиса конечно - просто я подумал что так легче будет. Да и с таким расширением больше небудет там служб у меня...
Автор: duh_S
Дата сообщения: 30.04.2010 11:49
сам себя поправлю:

Код:
...& for /f "tokens=1-2 delims=:" %%j in ("!Value:%Key%=!") do set "Value=%%k"
Автор: mugil_cephalus
Дата сообщения: 30.04.2010 13:03
Mark_Titov

Код: @echo off
cd\
set "sernum=1"
for /f "tokens=*" %%i in ('sc query ^|findstr /i "SERVICE_NAME: STATE"') do call:_1 "%%~i"
pause
goto:eof

:_1
if /i "_%bifurc%" equ "_true" goto:_2
echo.%~1|find /i "SERVICE_NAME:" |1>nul 2>&1 findstr /i "AudioSrv MDM winmgmt" &&(
echo.%sernum%. %~1
set /a sernum=%sernum%+1
set "bifurc=true"
goto:eof
) ||goto:eof

:_2
echo.%~1
set "bifurc="
goto:eof
Автор: Mark_Titov
Дата сообщения: 30.04.2010 13:29
mugil_cephalus - Супер. Спасибо.
А как теперь сделать так что бы вводя эти цифры - 1+enter=действие (net start\ net stop)?
Автор: kilserg
Дата сообщения: 30.04.2010 20:17
yurkesha


Цитата:
kilserg
А зачем так сложно?

Сложно - потому что не знаю еще всего инструментария, а сделать надо было


Цитата:
FINDSTR /B /C:"строка поиска" aaa.txt||(ECHO строка поиска>>aaa.txt)


О, спасибо, как раз ответ на мой вопрос: "можно ли в одну строку без сторонних утилит"
Автор: user5nov
Дата сообщения: 30.04.2010 22:14
Здравствуйте, помогите написать 2 батника, по следующим задачам.

1. Подсчет количества фалов в папке и подпапке с выводом количества в текстовый файл.
2. Подсчет объёма в папке и подпапке с выводом объема в текстовый файл.

В обоих случаях, вложенность фалов и папок большая. Это файловый сервер.
Автор: wolf0425
Дата сообщения: 01.05.2010 02:46
user5nov
Цитата:
1. Подсчет количества фалов в папке и подпапке с выводом количества в текстовый файл.
все же комментарий в текстовый файл допишу, на будущее. Без него - можно сильно сократить.

Код: for /f %%a in ('dir /b/s/a-d c:\papka\* ^| find /c /v ""') do 1>>file.txt echo.%%a files
Автор: user5nov
Дата сообщения: 01.05.2010 08:41
wolf0425
Спасибо большое за помощь, помогло, но:
1. В этом батнике при каждом выполнении в файл дописывается число, можно ли сделать так чтобы файл перезаписывался при каждом выполнении с новым числом, тоесть каждое выполнение один и тотже файл, и только одно число.?

2. Скрипт несработал ((
Файл создается но "= bytes", без цифр
Где-то накосячился я, непойму где
Кстати сдесь тоже нужно чтобы файл перезаписывался.
Автор: Ortios
Дата сообщения: 01.05.2010 09:35
user5nov

Цитата:
Где-то накосячился я

) угу, винду теперь на анлийскую переставляй, если лень, тогда так:

Код: for /f "tokens=3" %%a in ('dir /s/a-d c:\papka\* ^| findstr /r /b /c:"^[ 0-9]*файлов"') do set sizetxt=%%a
1>>file.txt echo %sizetxt: =% bytes
Автор: user5nov
Дата сообщения: 01.05.2010 10:07
Ortios Спасибо, большое. Всё получилось.

Добавлено:
Потестив скрипты выяснил, что они не понимают ни русских папок, ни папок на латинице с пробелами. Подскажите как исправить эти проблемы ?
Автор: Mark_Titov
Дата сообщения: 01.05.2010 14:41
Кто подскажет как сделать что бы в ОТОБРАЖЕНИИ этой команды не было надписи -
"DISPLAY_NAME:"

Вот код -

Код:
@echo off
set "sernum=1"
for /f "tokens=*" %%i in ('sc query state^= all ^|findstr /i "Windows"') do call:_1 "%%~i"
pause
:_1
echo.%sernum%. %~1
set /a sernum=%sernum%+1
goto:eof
Автор: wolf0425
Дата сообщения: 01.05.2010 15:40
user5nov

Цитата:
Потестив скрипты выяснил, что они не понимают ни русских папок, ни папок на латинице с пробелами. Подскажите как исправить эти проблемы ?

вообще-то они и то и другое понимают, проблема не в скриптах
пути/имена с пробелами надо заключать в кавычки
если в текст батника вписываешь русское имя файла/папки - то надо или вписывать имена в команде в ДОС кодировке, или при исполнении батника текущую кодировку заменять на виндовую. В смысле - кодировка русских букв в командах должна совпадать с текущей кодировкой cmd.exe на момент исполнения строки.

типа так:

Код: chcp 1251
dir "c:\русская папка\*"
Автор: Mark_Titov
Дата сообщения: 01.05.2010 16:29
wolf0425
Спасибо огромное - работает!


А на второй вопрос есть вообще решение или может это не реализуемо?

Благодарю...
Автор: wolf0425
Дата сообщения: 01.05.2010 17:36

Цитата:
А на второй вопрос есть вообще решение или может это не реализуемо?
да реализуемо наверно - только если брать информацию с той простыни sc то батник надо с нуля переписывать, вписывая полный ручной разбор информационных блоков. лениво же.
если вдруг придумаешь как по имени сервиса узнать конкретно его статус - скрутить их попроще будет.
Автор: Mark_Titov
Дата сообщения: 01.05.2010 18:11
Ну хотя бы что бы он писал на против статус службы -

Код:
1. Windows Audio RUNING
2. Windows Installer STOPING

Для продолжения нажмите любую клавишу . . .
Автор: wolf0425
Дата сообщения: 01.05.2010 20:12

Цитата:
вот исходный код -
толку то от него. держи.

Код: @echo off
echo.
set "sernum=1"
for /f "tokens=1*" %%a in ('sc query state^= all') do (
    if /i .%%a equ .DISPLAY_NAME: echo %%b | find /i "Windows" 1>nul && set "name=%%b" || set "name="
    if defined name if /i .%%a equ .STATE call :_print %%b
)
echo.
pause
exit

:_print
echo.%sernum%. %name% %3
set /a sernum += 1
goto :eof
Автор: Mark_Titov
Дата сообщения: 01.05.2010 23:25

Цитата:
толку то от него. держи.

Спасибо большое! Работает...
Толк есть - не сомневайся!
Автор: Mark_Titov
Дата сообщения: 02.05.2010 11:45
Вот теперь наверное самое трудное. Я честно говоря не знаю можно ли это вообще реализовать встроенными средствами. Ну может кто из гуру командной строки знает.
Как говорится - надежда умерает последней.

Вообщем я все собрал как нужно для моей задачи.


Код:
@ECHO OFF
color A
:_menu
CLS
ECHO.
ECHO ******************************************************************************    
ECHO.
ECHO 1. START SERVICE
ECHO.
ECHO 2. STOP SERVICE
ECHO.
ECHO 3. ADVANCED MENU
ECHO.
ECHO 4. Exit
ECHO.
ECHO ******************************************************************************
ECHO.
ECHO Write here[1,2,3,4] and press Enter:
SET /P reply=

IF /I "%reply%"=="1" GOTO :10
IF /I "%reply%"=="2" GOTO :20
IF /I "%reply%"=="3" GOTO :30
IF /I "%reply%"=="4" exit

:10
CLS
@echo off
echo.
set "sernum=1"
for /f "tokens=1*" %%a in ('sc query state^= all') do (
if /i .%%a equ .DISPLAY_NAME: echo %%b | find /i "Windows" 1>nul && set "name=%%b" || set "name="
if defined name if /i .%%a equ .STATE call :_print %%b
)

echo.
ECHO Write here[1,2,3,4] and press Enter:
SET /P reply=
IF /I "%reply%"=="0" GOTO :_menu
IF /I "%reply%"=="1" GOTO :11

:_print
echo.%sernum%. %name% %3
set /a sernum += 1
goto :eof

:11
CLS
@echo off
echo.
pause
Автор: wolf0425
Дата сообщения: 02.05.2010 12:52
Mark_Titov, ты опять полностью поменял задачу, сделав ненужным 80% ранее сделанного.
замечание по манере твоего программирования:
Цитата:
IF /I "%reply%"=="0" GOTO :_menu
IF /I "%reply%"=="1" GOTO :11
а куда пойти когда например %reply%==666 ? такая же бага в остальных аналогичных ветвлениях.

написать то всё это можно, основной вопрос - нафига так извращаться.
почему не управлять сервисами через штатные гуевые средства или например через плагин к FARу?
Автор: Mark_Titov
Дата сообщения: 02.05.2010 13:15

Цитата:
написать то всё это можно,

Очень нужно - подскажите как?


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

Дело в том что эта консоль как я говорил уже для "БЛОНДИНОК".
Задача поставленна сделать мониторинг беспроводной связи на предпреятии с ведением логов и отсылкой на корп почту в случае отсутствия ее. Это для анализа промежутков времени пропадания связи и др задач. Сделал. Это был первый этап реализации.

А вот теперь нужно что бы эта консоль управления была универсальной...
Что бы сама находила нужные сервисы (в качестве сервисов - батники с пингами и соданием логов и отсыла на мыла и прочей лабуды) - это уже с вашей помощью реализованно (Спасибо за это) и запускала либо останавливала отдельно требуемый сервис. Другими словами - написал и забыл. Что бы по сто раз туда не лезть и не переписывать что-то при изменении чего-либо.
И самое главное - этим менеджером будет пользоваться человек который крайне мало знаком с компами - скажем просто юзер. Потому и говорю что для "блондинок" нужно сделать. И не устанавливать человеку который будет за этим следить (у нас отдельный человек за этим следит, будет смотреть логи, анализировать их и принимать решения к действию) кучу плагинов и утилей - просто кинул ему этот менеджер и все. А там все на пальцах расписанно и показанно что и как... Вот в чем суть...

Прошу подскажите как это сделать
Премного благодарен...
Автор: wolf0425
Дата сообщения: 02.05.2010 21:21

Цитата:
Очень нужно - подскажите как?
когда печатается список сервисов - в цикл сверху добавить формирование массива переменных с именами сервисов.
if /i .%%a equ .SERVICE_NAME: set _service_%sernum%=%%b
Это делаешь один раз на старте программы, после чего работать прицельно только с нужными сервисами.

по имени сервиса можно сервис запустить, остановить, посмотреть статус... много чего... sc /?
пример
set sernum=2
sc stop !_service_%sernum%!

быстро пройтись по переменным
for "tokens=2,3 delims=_=" %%a in (' set _service_') do echo.%%a. %%b

отображаемые имена сервисов тоже имеет смысл засунуть в переменные, раз тебе много раз надо их печатать.

и в начало батника добавь setlocal enabledelayedexpansion чтоб !переменные! поддерживались.
Автор: Mark_Titov
Дата сообщения: 02.05.2010 22:09
...Круто. Спасибо. Но настолько глубоко я еще не залезал. Тут мне не совсем понятно.
Может на этом примере покажешь что и куда прикручивать?


Код:
@echo off
echo.
set "sernum=1"
for /f "tokens=1*" %%a in ('sc query state^= all') do (
if /i .%%a equ .DISPLAY_NAME: echo %%b | find /i "Windows" 1>nul && set "name=%%b" || set "name="
if defined name if /i .%%a equ .STATE call :_print %%b
)
echo.

ECHO PLEASE SELECT NUMBER AND PRESS ENTER:
SET /P reply=

:_print
echo.%sernum%. %name% %3
set /a sernum += 1
goto :eof
Автор: Nikoderiko
Дата сообщения: 02.05.2010 23:11
Вопрос: как получить полный путь к папке (то есть с длинными именами файлов) в которой находится батник?
Автор: 01MDM
Дата сообщения: 03.05.2010 00:24
Nikoderiko

Код:
echo %~dp0

call /?
for /?
Автор: melboyscout
Дата сообщения: 03.05.2010 00:37
Помогите пожалуйста...
Есть текстовый файл примерно следующего содержания:
./file001_3.fcd|203814|2010|Apr|16|10:22:43
./file002_3.fcd|295581|2010|Apr|19|09:35:53
./file003_3.fcd|658518|2010|Apr|20|10:22:11
необходимо извлечь в переменную имя файла с датой создания: yyyy mm (число, а не символы) dd [если проще - то это текущая дата]
и нужно отбросить первых 2 "служебных" символа
задача возникла для автоматизации скачки "сегодняшнего файла" с фтп (т.е. я предварительно скачиваю файл-список с фтп, нахожу нужный файл, а потом загружаю искомый)

нашел что то подобное:
for /f "usebackq delims=| tokens=1,3" %%i in ( `type "InFile"` ) do (
if "%%i"=="UF" (
echo %%j>>"OutFile"
)
)

... но незнаю как адаптировать
Автор: 01MDM
Дата сообщения: 03.05.2010 00:56
melboyscout

Код:
@echo off
setlocal

for /f "tokens=1,3-5 delims=|" %%i in (InFile) do call:set %%i %%j %%k %%l
goto:eof

:set
set "name=%1"
set "yyyy=%2"

for %%i in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
    set /a cnt+=1
    if "%%i"=="%3" goto:next
)

:next
set "mm=0%cnt%"
set "dd=%4"

set file=%name:~2%_%yyyy%-%mm:~-2%-%dd%

1>>OutFile echo %file%
Автор: melboyscout
Дата сообщения: 03.05.2010 01:05
01MDM
немного не так....
вот что выходит в файл:

Цитата:
d11241_3.fdz_2010-17-15
d11242_3.fdz_2010-21-16
d11243_3.fdz_2010-25-19
d11244_3.fdz_2010-29-20
d11245_3.fdz_2010-33-27

1. чтото с датами...
2. мне нужно имя только одного файла, который удовлетворяет дате размещения 2010|Apr|27 , например
3. имя желательно передать в переменную для последующей загрузки
Автор: 01MDM
Дата сообщения: 03.05.2010 01:55
melboyscout

Цитата:
1. чтото с датами...

Забыл обнулить %cnt%

Цитата:
2. мне нужно имя только одного файла, который удовлетворяет дате размещения 2010|Apr|27 , например

Вот немного переделал

Код:
@echo off
setlocal

for /f "tokens=1,3-5 delims=|" %%i in (InFile) do call:set %%i %%j %%k %%l
echo %file%
goto:eof

:set
for %%i in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
set /a cnt+=1
if "%%i"=="%3" goto:next
)

:next
set "mm=0%cnt%"
if "%4.%mm:~-2%.%2"=="27.04.2010" (
set "file=%~nx1"
)

set "cnt="
Автор: melboyscout
Дата сообщения: 03.05.2010 02:07
01MDM

Цитата:
Вот немного переделал

Отлично!!!
А вот как вместо фиксированной даты подставить переменные текущей даты?
Что-то типа

Цитата:
set "mm=0%cnt%"
if "%4.%mm:~-2%.%2"=="%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%" (
set "file=%~nx1"
)


так или не так? не работает? может удвоить %% ?

Add

Поспешил... если подставить дату "08.04.2010" то не работает... подходит только если "8.04.2010"

Add2

Вообще это глупо... я хотел скачать с фтп файл за текущий день, а нагородилось такое
1. Закачай сначала список файлов
2. Выбери нужный файл
3. Скачай нужный файл...

А если за последний день не один, а два файла будет выложено... ... и еще много если....

01MDM СПАСИБО, что не бросил
Автор: wolf0425
Дата сообщения: 03.05.2010 02:31

Цитата:
Может на этом примере покажешь что и куда прикручивать?

проще прикрутить, чем дальше объяснять.

Код: @echo off
setlocal enabledelayedexpansion

title Scanning
set "sernum=100"
for /f "tokens=1*" %%a in ('sc query state^= all') do (
    if /i .%%a equ .SERVICE_NAME: set "_servicen_=%%b" && title Scanning: %%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 query %%b ^| findstr /r /b /c:" *STATE " ') do (
        set "_displ_=%%b "
        echo.%%a !_displ_:~0,12!    %%s    !_serviced_%%a!
    )
)
echo.
title Select service
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 query !_service_%reply%! | findstr /r /b /c:" *STATE " | 1>nul find "RUNNING" && sc stop !_service_%reply%! || sc start !_service_%reply%!
pause & goto :display

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132

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


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