2017-06-27 118 views
1

我想從日誌文件中已安裝的版本和當前版本,我已經使用以下命令得到的輸出:比較安裝和當前版本

$versions = Select-String -Path $path -Pattern "Comparing product versions" | 
      % { $_.Line.Split() } 

$installed = $versions[6] 
$installed = echo "$installed".Trim(",") 
$current = $versions[7] 

的問題是:我不想硬編碼。有沒有像正則表達式這樣的方法來取代它,並分別獲取已安裝的版本和當前版本。

這是什麼的相關日誌行看起來像:

ISS_LOG [14:45:36]: Comparing Product Versions - Installed[1.2.0.10], Current[1.2.0.10]

嘗試第一解決方案,我得到一個錯誤: Error - cannot index into null array

+0

你究竟是指什麼是 「硬編碼」? –

+0

如果我指定字符串的位置爲7,那麼這將是硬編碼。在某些情況下,位置可能不同,所以我不會得到正確的輸出。 –

+0

對不起,水晶球在清潔工。請提供樣本輸入並解釋您想要從中提取的內容。 [編輯]你的問題這樣做。 –

回答

2

您可以使用正則表達式的字符串Installed\[(.*)\],Current\[(.*)\],假設模式是你已經安裝了/ current,後跟方括號和版本號。

這將返回具有完全匹配(不是你想要的)的組並匹配什麼是他的方括號(你想要的)。 More regex explanation

代碼:

$myString = "ISS_LOG [14:45:36]: Comparing Product Versions - Installed[1.2.0.10], Current[1.2.0.10]" 

$installedRegex = "Installed\[(.*)\]," 
$currentRegex = "Current\[(.*)\]" 

$installedVersion = $([regex]::Matches($myString,$installedRegex)).Groups.value[1] 
$CurrentVersion = $([regex]::Matches($myString,$currentRegex)).Groups.value[1] 

輸出 On PowerShell 5.1

編輯 - PowerShell的2.0版

$installedVersion = $([regex]::Matches($myString,$installedRegex)).Groups[1].value 
$CurrentVersion = $([regex]::Matches($myString,$currentRegex)).Groups[1].value 
+0

在執行$ installedVersion後出現錯誤,錯誤是無法索引到一個空數組 –

+1

在PowerShell 5.1中正常工作 - 增加了輸出截圖。 請記住,只有當該行具有'Installed [ver],'和'Curent [ver]'...時,它才能正常工作......否則將找不到匹配項,並且數組將爲空。 你可以在'try' /'catch'或使用if($ myString-like ...'來處理這個問題,只處理你知道會有這些字段的字符串 – gms0ulman

+0

根據你的截圖我會接受你的回答,但是我的問題還沒有解決,我已附加screenshort作爲答案,我希望你會給我一個解決方案。謝謝你的朋友 –

相關問題