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'
}

探しているものを少し変更して、まったく同じコード行を 7 回繰り返します。私が得る出力は次のとおりです (注: これはほんの小さな出力です)。

/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  

これはほぼ正しいですが、コードが ($Test) に到達したときに変数ではなく文字列を想定しているため、エラーが発生しているのは -replace 行です。上記の目的の出力ではなく、この例で /GPR を見つけるたびに解析しているテキスト ファイルの行全体を投稿しています。この行を修正して、私が使用していた元のコードと同じ出力を得る方法を知っている人はいますか?

編集:新しいコードで現在取得している出力は、解析しようとしている.txtファイルにある正確なテキストでもあります。.txt にはそれよりも多くの行がありますが、ほとんどの部分はそれと同じです。/GPR または配列内の他の可能な文字列の取得と、毎回「on」という単語の後に来るサーバー名のみに関心があります。

4

2 に答える 2

1

これは、変数の展開を妨げる単純な引用符が原因だと思います。'(?:.*)($Test)(?:.*)(?<=on\s)(\w+)(?:.*)'PS は、$test 変数をその値に置き換えずに、正確な文字列を置き換えようとしています。それらを引用符で置き換えてみてください。ただし、次のように、2 番目の文字列の単純な引用符を保持してください。

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'
于 2013-03-01T18:20:44.150 に答える
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'
于 2013-03-01T17:02:35.347 に答える