我试图运行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循环完成后使其回车,以开始使用新数据集的新行。
答案 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个字段。
带有line
,linem
(修改后的行 - 减去字段名称)和linet
(总行 - 重建)的jiggery-pokery首先通过删除所需数据来提取所需数据字符串,直到目标。然后将该行重建为linet
,并与line
中的原始版本进行比较。这使我们能够区分开始Printer status
的行和开始Extended printer status
的行 - 当目标是printer status
时,第一行将被重建以匹配原始行,但第二行将关闭Extended printer status
然后重新添加printer status
,这样重建的行与原始行不匹配...
为新要求修改 - 输出到文件。
它位于一个相当奇怪的地方 - 通过调用子例程的for
语句,将子例程中的echo
语句的任何输出重定向到指定的文件。
答案 1 :(得分:0)
我对prnmngr.vbs列表的输出感到震惊。
没有任何内容可以界定属性名称的结尾/值的开头。
此外,属性的数量可以变化(开始时间和直到时间可能存在或可能不存在)
鉴于该实用程序是VBS,修改脚本并创建我们自己的版本相对容易。
我创建了自己的版本,有两个主要变化:
1)-l
选项现在使用:
2)我已添加-lc
选项以使用CSV格式列出打印机。第一行是标题行,给出每列的名称。所有列值都用引号括起来。始终列出开始时间和直到时间(通常为空)。
以下简单命令将直接创建CSV:
cscript prnmngrMod.vbs -lc -s lak-print01 >test.csv
代码太大,无法在此答案中发布,因此我已将其提供给http://pastebin.com/e7xwhmn3