2014-09-10 93 views
0

我再次被PowerShell困住了。 這是我的場景: 我有一個Excel報表在裏面。在Excel文件中有兩條線,我正在尋找在excel中查找值並將其打印出來

錯誤總數= 0

致命錯誤總數= 0

與這兩條線的問題是空格後「錯誤」可能會因報告而異。另一個問題是錯誤的數量(在這種情況下爲0)在同一個單元格中。

我想要做的是找到這兩行並返回錯誤的數量。 以下是我的代碼到目前爲止的樣子。我知道它缺少一些東西,也沒有工作。我嘗試了很多沒有運氣的正則表達式。

任何幫助,將不勝感激。

謝謝大家提前。

$File = "C:\test\setup.xlsx" 
$Excel = New-Object -ComObject Excel.Application 
$Excel.visible = $true 
$Workbook = $Excel.workbooks.open($file) 
$Worksheets = $Workbooks.worksheets 
$Worksheet = $Workbook.Worksheets.Item(1) 
$Range = $Worksheet.UsedRange 
$Keywords="fatal errors", "errors" 
$Filter = "Total number of"+ ($(($Keywords|%{[RegEx]::Escape($_)}) -join "|")) 
$Search = $Range.find($Filter) 
IF($Search -match '\d[0]') 
    { 
    "No Errors found" 
    "No fatal errors found" 
    } 
ELSE 
    { 
    "number of errors found = " $search 
    "number of fatal errors found = " $search 
    } 

回答

2

所以我會說,你的正則表達式正在尋找「總數offatal錯誤」或「總數oferrors」因爲你以後「的」沒有空間開始。這可以解決它。

"Total number of (?:fatal)?errors\s*=\s*(\d*)" 

這就是我將要使用的RegEx。看到它在這裏行動

說實話,我不會依靠Excel來找到它。我會告訴PowerShell來找到它,這是我怎麼會做它:

$File = "C:\test\setup.xlsx" 
$Excel = New-Object -ComObject Excel.Application 
$Excel.visible = $true 
$Workbook = $Excel.workbooks.open($file) 
$Worksheets = $Workbooks.worksheets 
$Worksheet = $Workbook.Worksheets.Item(1) 
$Range = $Worksheet.UsedRange 
$Errors = 0 
$FatalErrors = 0 
$Range.cells.value2 | Where{$_ -match "Total number of (?:fatal)?errors\s*=\s*(\d*)"} | ForEach{ 
    Switch($Matches[0]){ 
     {$_ -like "*fatal*"}{$FatalErrors+=$Matches[1];continue} 
     default{$Errors+=$Matches[1]} 
    } 
} 

If($Errors -gt 0){ 
    "Number of errors found = " + $Errors 
}else{ 
    "No errors found" 
} 

If($FatalErrors -gt 0){ 
    "Number of errors found = " + $FatalErrors 
}else{ 
    "No fatal errors found" 
} 

結果(由測試表格我設置準確):

Number of errors found = 23 
Number of errors found = 7 

更改單元格的值有3個錯誤後的空間和數量設置爲2,並設置致命錯誤爲0結果:

Number of errors found = 2 
No fatal errors found 

編輯:好了,所以交換機可能會混淆我想,如果你不˚F熟悉它。這是另一種循環,它的工作原理是這樣的:

Switch(<array to loop through>){ 
    Condition {Action if condition is true} 
    Condition2 {Action if condition2 is true} 
    default {Action to take if no conditions are true} 
} 

所以在我們的例子中,我們有一個被檢查,看看是否在Where語句的單元格中加上「致命」的一個條件。如果是這樣,則將匹配的文本添加到$ FatalErrors變量中。如果它不具有致命性,那麼它將轉到Default並將匹配添加到$ Errors。匹配文本是字符串末尾的數字。

+0

TheMadTechnician來拯救:) 這個作品完美。你介意給我解釋一下這裏發生了什麼?我有點從「開關」開始丟失它 $ Range.cells.value2 |其中{$ _ -match「(?:fatal)?錯誤總數\ s * = \ s *(\ d *)」} | ForEach {$ _ -like「* fatal *」} {$ FatalErrors + = $ Matches [1]; continue} 默認{$ Errors + = $ Matches [1]} – Besiktas 2014-09-11 13:13:52

+0

希望現在有道理。 – TheMadTechnician 2014-09-11 17:03:22

+0

它確實有意義但仍令人困惑。我想我必須玩得更多。一如既往地感謝您的幫助。 – Besiktas 2014-09-11 18:01:10

相關問題