Пакетный файл Вложение findstr внутри цикла

Я пытаюсь запустить скрипт prntmngr.vbs. Я пытаюсь найти такие строки, как имя принтера, имя сервера и т. Д. На каждом сервере находится около 80-200 принтеров, и я хочу, чтобы он передавал информацию в формате csv.

У меня проблемы с вложением циклов поиска и поиска информации. Я собрал некоторые вещи.

Запуск VBS дает мне каждый принтер и его информацию.

The VBS outputs every printer in a block of information as follows. Theres about 80 printers on this one server. I'll worry about scoping out to other servers, as long as I can get it to output the information.

Server name lak-print01
Printer name 1015_Q1
Share name 1015_Q1
Driver name HP LaserJet 4350 PCL 5e
Port name IP_192.168.15.249
Comment Trust & Savings
Location 43rd & Meridian
Print processor HPCPP5r1
Data type RAW
Parameters
Attributes 8776
Priority 1
Default priority 0
Average pages per minute 0
Printer status Other
Extended printer status Offline
Detected error state Offline
Extended detected error state Other

Server name lak-print01
Printer name 1014_Q1
Share name 1014_Q1
Driver name Canon iR3225 PCL5e
Port name IP_192.168.14.245
Comment CSR and Teller Printer
Location Summit
Print processor WinPrint
Data type RAW
Parameters
Attributes 10824
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown

Server name lak-print01
Printer name 1011_Q3
Share name 1011_Q3
Driver name HP LaserJet 4200 PCL 6
Port name IP_192.168.11.247
Comment HP LaserJet 4200 not being used can delete
Location Spanaway
Print processor HPZPP3xy
Data type RAW
Parameters
Attributes 8778
Priority 1
Default priority 0
Average pages per minute 0
Printer status Idle
Extended printer status Unknown
Detected error state Unknown
Extended detected error state Unknown

например, я хотел бы, чтобы вывод был CSV, который выводит пример VBS для

lak-print01,1015_Q1,HP LaserJet 4350 PCL 5e,IP_192.168.15.249,Trust & Savings,43rd & Meridian,Other
lak-print01,1014_Q1,Canon iR3225 PCL5e,IP_192.168.14.245,CSR and Teller Printer,Summit,Idle

вытащить строки поиска для сервера печати, имя принтера, драйвер принтера, имя порта, комментарий, местоположение, статус

У меня есть рабочий сценарий

@echo off

SetLocal enabledelayedexpansion

cscript prnmngr.vbs -l -s lak-print01 >test.csv

for /f "tokens=3*" %%i in ('findstr /i /c:"Printer name" /i /c:"Server name" /i /c:"Printer status" /i /c:"Driver name" test.csv') do @echo %%i, 
endlocal

Что выводит

1005_Q2,
HP,
Other,
status,
lak-print01,
1004_Q2,
HP,
Idle,
status,
lak-print01,
1004_Q1,
HP,
Idle,
status,
lak-print01,
1003_Q2,
HP,
Idle,
status,
lak-print01,
1003_Q1,
HP,
Idle,
status,

Что замечательно, однако, это единственное, что тянет первое слово в имени драйвера, даже с подстановочными знаками в токенах. Теперь мне нужно только выяснить, как сделать возврат каретки после завершения цикла for, чтобы начать новую строку с новым набором данных.

2 ответа

Решение
@ECHO Off
SETLOCAL enabledelayedexpansion
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
(FOR /f "delims=" %%a IN (q25900051.txt) DO CALL :analyse "%%a")>printers.csv

GOTO :EOF

:analyse
SET "line=%~1"
SET /a fieldnum=0
FOR %%s IN ("Server name" "Printer name" "Driver name"
            "Port name" "Comment" "Location" "Printer status" 
        "Extended detected error state") DO CALL :setfield %%~s
GOTO :eof

:setfield
SET /a fieldnum+=1
SET "linem=!line:*%* =!"
SET "linet=%* %linem%"
IF "%linet%" neq "%line%" GOTO :EOF 
IF "%linem%"=="%line%" GOTO :EOF
SET "$%fieldnum%=%linem%"
IF NOT DEFINED $8 GOTO :EOF 
SET "line="
FOR /l %%q IN (1,1,7) DO SET "line=!line!,!$%%q!"
ECHO !line:~1!
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
GOTO :eof

Я использовал файл с именем q25900051.txt содержащий ваши данные для моего тестирования.

Это может быть автоматизировано немного дальше, но у меня нет времени в настоящее время.

По сути, он анализирует каждую строку и устанавливает поле номер 1..number-of-columns+1. Когда число столбцов + 1-й столбец заполнено, выходные данные накапливаются и echoЭд и $ Сброс переменных.

Часть "Вручную" вводит имена полей, которые нужно выбрать, включая поле "конец блока" в качестве последней записи; тогда переменная $8 и верхний предел для %%q установлены - 8 полей, которые потенциально анализируются, 7 - выводятся.

Jiggery-покеры с line, linem (измененная строка - минус имя поля) и linet (итоговая линия - реконструированная) сначала извлекает необходимые данные, удаляя строку до цели. Затем линия реконструируется как linet и по сравнению с оригинальной версией в line, Это позволяет нам различать линию, которая начинается Printer status и линия, которая начинается Extended printer status - когда цель printer status, первая строка будет восстановлена, чтобы соответствовать оригиналу, но вторая будет обрезана Extended printer status затем снова добавить printer status, поэтому восстановленная линия не соответствует оригинальной...


Изменено в соответствии с новым требованием - вывод в файл.

Это в довольно странном месте - заключите в скобки for оператор, вызывающий подпрограммы - любой вывод из echo операторы внутри подпрограмм будут перенаправлены в указанный файл.

  • так как ты спросил...

Я в шоке от вывода списка prnmngr.vbs.

Нечего ограничивать конец имени атрибута / начало значения.

Кроме того, количество атрибутов может варьироваться (время начала и время до могут или не могут присутствовать)

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

Я создал свою собственную версию, которая имеет два основных изменения:

1) -l опция теперь разделяет конец атрибута с :

2) Я добавил -lc возможность перечислить принтеры в формате CSV. Первая строка - это строка заголовка, в которой указано название каждого столбца. Все значения столбца заключены в кавычки. Время начала и до всегда указывается (часто пусто).

Следующая простая команда создаст CSV напрямую:

cscript prnmngrMod.vbs -lc -s lak-print01 >test.csv

Код слишком велик для размещения в этом ответе, поэтому я сделал его доступным по адресу http://pastebin.com/e7xwhmn3

Другие вопросы по тегам