批处理文件将findstr嵌套在循环中

时间:2014-09-17 20:45:36

标签: batch-file for-loop findstr

我试图运行prntmngr.vbs脚本。我试图找到打印机名称,服务器名称等字符串。每台服务器上大约有80-200台打印机 我希望它以csv格式管道信息。

我无法嵌套findtr&s和循环来获取信息。我把一些东西拼凑在一起。

运行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 个答案:

答案 0 :(得分: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并重置$个变量。

"手册" part输入要选择的字段的名称,包括"块的结尾"字段作为最后一个条目;然后设置变量$8%%q的上限 - 可能正在分析8个字段,输出7个字段。

带有linelinem(修改后的行 - 减去字段名称)和linet(总行 - 重建)的jiggery-pokery首先通过删除所需数据来提取所需数据字符串,直到目标。然后将该行重建为linet,并与line中的原始版本进行比较。这使我们能够区分开始Printer status的行和开始Extended printer status的行 - 当目标是printer status时,第一行将被重建以匹配原始行,但第二行将关闭Extended printer status然后重新添加printer status,这样重建的行与原始行不匹配...


为新要求修改 - 输出到文件。

它位于一个相当奇怪的地方 - 通过调用子例程的for语句,将子例程中的echo语句的任何输出重定向到指定的文件。

  • 既然你问过......

答案 1 :(得分:0)

我对prnm​​ngr.vbs列表的输出感到震惊。

没有任何内容可以界定属性名称的结尾/值的开头。

此外,属性的数量可以变化(开始时间和直到时间可能存在或可能不存在)

鉴于该实用程序是VBS,修改脚本并创建我们自己的版本相对容易。

我创建了自己的版本,有两个主要变化:

1)-l选项现在使用:

分隔属性的结尾

2)我已添加-lc选项以使用CSV格式列出打印机。第一行是标题行,给出每列的名称。所有列值都用引号括起来。始终列出开始时间和直到时间(通常为空)。

以下简单命令将直接创建CSV:

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

代码太大,无法在此答案中发布,因此我已将其提供给http://pastebin.com/e7xwhmn3