動作する次のスクリプトがあり、より効率的な方法で書き直そうとしています。以下のコード行は機能し、私が望むものを達成します:
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」という単語の後に来るサーバー名のみに関心があります。