0

我正在创建一个 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)
4

2 回答 2

1

你可以试试这个。/GPR它仅在存在(以及“打印在”中的“打开”)时返回一行。

Get-Content .\test.txt | % { 
    if ($_ -match '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)') {
        $_ -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
    }
}

输出:

/GPR,R3556
/GPR,R3556

我确信有更好的正则表达式版本。我还在学习它:-)

编辑这更容易阅读。正则表达式仍然可以提取,但我首先使用 /GPR 过滤掉行select-string

Get-Content .\test.txt | Select-String -SimpleMatch -AllMatches -Pattern "/GPR" | % {
    $_.Line -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
}
于 2013-02-21T19:12:25.133 回答
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 
   }
 }                                                           
于 2013-02-21T19:59:29.197 回答