2013-03-01 223 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'