我正在开发创建PowerShell脚本的第一步,该脚本将读取打印机日志(可能使用get-WMI cmdlet),并解析日志。之后,我计划将脚本输出到.txt文件中,打印机的名称,打印机使用次数的计数器(如果可能),以及日志中的特定信息。
为了做到这一点,我决定尝试倒退。以下是日志的一小部分:
10 Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***. Size in bytes: 53704; pages printed: 2 20130219123105.000000-300
10 Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***. Size in bytes: 53700; pages printed: 2
向后工作,只关注首先解析,我希望能够专门获得“/ GRP”,“R3446(一般来说,R * * ,因为这是打印机名称)“,并获得一个计数器,显示特定打印机在日志文件中出现的频率。
自从我上次与Powershell合作以来已经有一段时间了,但是目前这是我为了尝试实现目标而设法创建的:
Select-String -Path "C:\Documents and Settings\a411882\My Documents\Scripts\Print Parse Test.txt" -Pattern "/GPR", " R****" -AllMatches -SimpleMatch
代码不会产生任何错误,但是我也无法在屏幕上显示任何输出,以查看我是否正在捕获/ GRP和打印机名称。目前我正在努力确保在收集任何计数器之前我正在收集正确的输出。有人能帮助我并告诉我我的代码出了什么问题吗?
谢谢!
编辑:修复了我的代码中的一个小错误,该错误导致屏幕上没有数据显示。目前,此代码输出整行两行测试文本,而不是仅输出/ GPR和服务器名称。新输出如下:
My Documents\Scripts\Print Parse Test.txt:1:10 Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on
R3556 via port IP_***.***.***.***. Size in bytes: 53704; pages printed: 2
20130219123105.000000-300
My Documents\Scripts\Print Parse Test.txt:2:10 Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on
R3556 via port IP_***.***.***.***. Size in bytes: 53700; pages printed: 2
我想尝试最终看起来像下面这样:
/GPR, R****, count: ## (although for now I'm less concerned about the counter)
答案 0 :(得分:1)
你可以试试这个。它仅在/GPR
(以及“打印”的“打开”)出现时返回一行。
Get-Content .\test.txt | % {
if ($_ -match '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)') {
$_ -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
}
}
输出:
/GPR,R3556
/GPR,R3556
我确信有更好的正则表达式版本。我还在学习它: - )
编辑这更容易阅读。正则表达式仍在那里进行提取,但我首先使用select-string
过滤掉/ GPR的行:
Get-Content .\test.txt | Select-String -SimpleMatch -AllMatches -Pattern "/GPR" | % {
$_.Line -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
}
答案 1 :(得分:0)
我通常从我匹配的行的示例开始,并从中构建一个正则表达式,用正则表达式元字符替换文本的可变部分。这使得正则表达式更长,但后来更直观易读。
将正则表达式赋给变量,然后在后续代码中使用该变量,以防止正则表达式的混乱细节混乱其余代码:
[regex]$DocPrinted =
'Document \d\d, \w+/(\D{3})[0-9_]+: owned by \w+ was printed on (\w+) via port IP_[0-9.]+ Size in bytes: \d+; pages printed: \d+'
get-content <log file> |
foreach {
if ($_ -match $DocPrinted)
{
$line -match $docprinted > $null
$matches
}
}