2013-07-10 3 views
0

Прошло некоторое время с тех пор, как я закончил пакетные файлы Windows, и, похоже, я забыл все. То, что я хочу сделать, это искать службы, в которых путь имеет пробелы, но строка не цитируется. Мальчик, это было бы легко с bash, но ...«cut» как функция для пакетного файла Windows

Итак, в двух словах, я начинаю с sc query | findstr SERVICE_NAME и выгружаю его в файл temp. Затем я прочитал его обратно к переменной с for /F "tokens=2" %%f in (temp_file) do set services=!services! %%f. Это получает меня переменную с разделенным пробелами списком всех сервисов моего хоста. Теперь, в цикле FOR против этой переменной, я запускаю sc qc %%s | findstr BINARY_PATH_NAME и выгружаю THAT в временный файл. Это ветры, содержащий что-то вроде (котировки шахты, чтобы сохранить все пробелы):

"  BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k LocalSystemNetworkRestricted" 

Я читал и Googling и тестирование и пытается все, пытаясь закончить резки, что выход на : так что я могу просто завершитесь с самим путем, а затем начните выяснять мерзость, которая должна быть регулярными выражениями под Windows. Но я просто не могу получить эту строку.

+0

Каков желаемый результат? – Endoro

ответ

0

Что-то вроде этого?

@echo off 
for /f "tokens=2 delims=: " %%a in ('sc query ^| findstr SERVICE_NAME') do (
    sc qc %%a | findstr BINARY_PATH_NAME 
) 
pause 
2

Вы можете сделать следующее, если вы хотите, чтобы двоичный путь для всех услуг:

for /f "tokens=2" %%n in ('sc query ^| findstr SERVICE_NAME') do (
    for /f "delims=: tokens=1*" %%r in (
    'sc qc "%%~n" ^| findstr BINARY_PATH_NAME' 
) do (
    echo %%~s 
) 
) 

Изменения echo %%~s к echo %%~n:%%~s если вы хотите двоичный путь предваряется именем службы.

+0

Обратите внимание, что 'for/f' ужасно в присутствии пробелов. Вы можете использовать 'tokens = 2 *' для соответствия второму и всем последующим маркерам, но каждому присваивается новая переменная; в этом случае '% n','% m' и т. д. –

1

Ansgar Wiechers имеет хорошее решение, использующее SC для получения информации о запущенных сервисах. Он также демонстрирует, как использовать опцию дефолтов FOR/F для разрыва на :.

Другой вариант - использовать WMIC для получения той же информации более прямым образом.

Если все, что вы хотите, это список бинарных путей для всех активных (погонных) услуг, то все, что вам нужно:

wmic service where "state='Running'" get pathname 

Если вы хотите, чтобы список имен служб, а также бинарные пути:

wmic service where "state='Running'" get name, pathname 

Есть много других свойств, которые могут быть перечислены. Введите wmic service get /? из командной строки, чтобы получить полный список.

Если вы хотите получить значения в переменных в пакетном процессе, чтобы вы могли принять меры, то используется цикл FOR/F. Я добавляю свойство состояния в конце, чтобы избежать нечетной привязки FOR/F, которая добавляет нежелательный <CR> в конец каждой строки вывода WMIC. Нежелательные <CR> будут прикреплены к значению состояния, которое нам неинтересно. Я также использую состояние с FINDSTR для отсеивания нежелательных строк, поэтому нет необходимости в предложении WMIC WHERE. В этом примере я просто повторяю значения, но, очевидно, вы можете делать с ними все необходимое.

for /f "tokens=2,3 delims=," %%A in (
    '"wmic service get name, pathname, state /format:csv|findstr /e Running"' 
) do echo %%A: %%B 
Смежные вопросы