字符串替换为变量

时间:2013-03-01 16:23:09

标签: arrays parsing powershell powershell-v2.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或任何其他可能的字符串,然后是在&#34; on&#34;之后的服务器名称。每一次。

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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'
相关问题