2013-03-01 150 views
0

我有下面的脚本可用,我试图以更有效的方式进行重写。下面的工作下面几行代码,完成我想要的东西:将字符串替换为变量

Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern "/GPR" | % { 
    $_.Line -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2' 
} 

Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern "DV6" | % { 
    $_.Line -replace '(?:.*)(DV6)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2' 
} 

我重复的代码完全相同的线路七次略有改变就是我要找的。我得到的输出是下面的,我会想(注:这只是一个小的输出):

/GPR,R3556 
/GPR,R3556 

虽然这个作品,我真的不喜欢的代码是如何混乱是和我决定尝试以更有效的方法重写它。我已经重新编写的代码是这样的:

$My_Arr = "/GPR", "DV6", "DV7", "RT3", "DEV", "TST", "PRE" 
$low = $My_Arr.getlowerbound(0) 
$upper = $My_Arr.getupperbound(0) 
for ($temp=$low; $temp -le $upper; $temp++){ 
    $Test = $My_Arr[$Temp] 
    Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern $My_Arr[$temp] | % { 
    $_.Line -replace '(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2' 
    } 
} 

输出,这给了我如下:

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                 20130219123037.000000-300 

这几乎是正确的,不过-replace线是我的错误发生因为代码在达到($ Test)时期望一个字符串而不是变量。每次在本例中找到/ GPR,都会发布我正在解析的文本文件的整行内容,而不是上面显示的所需输出。有谁会知道一种方法来修复这条线,并获得与我使用的原始代码相同的输出吗?

编辑:我现在用新代码得到的输出也是我想要解析的.txt文件中的确切文本。在.txt中有更多的行,但大部分与此相同。我只关心获取数组中的/ GPR或任何其他可能的字符串,然后每次获取单词“on”后面的服务器名称。

+0

你能后的原始文本的样本是相匹配? – mjolinor 2013-03-01 16:41:17

+0

您从第二行代码获得的输出就是正在匹配的原始文本。对不起,应该提到它更清楚。 – Valrok 2013-03-01 16:47:23

+0

我不明白“第二行代码”是什么意思。你正在阅读我没有的文件输入..... – mjolinor 2013-03-01 16:54:18

回答

1

我要说,这是通过简单的报价,这防止可变扩张造成的。 PS正在试图替换确切的字符串'(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)',而不是用它的值替换$ test变量。 尝试用引号替换它们,而是保持简单的报价在第二个字符串,如下所示:

Get-Content "C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt" | Select-String -SimpleMatch -AllMatches -Pattern $My_Arr[$temp] | % { 
    $_.Line -replace "(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)", '$1,$2' 
0

这对你的数据有用吗?

$file = 'C:\Documents and Settings\a411882\My Documents\Scripts\printserveroutput.txt' 
$regex = '(?:.*)(/GPR|DV6|DV7|RT3|DEV|TST|PRE)(?:.*)(?<=on\s)(\w+)(?:.*)' 
(Get-Content $file) -match $regex -replace $regex,'$1,$2'