在Excel中find一个值并打印出来

我再一次被困在PowerShell中。 这是我的情况:我有一个Excel报表在里面。 在Excel文件中有两条线,我正在寻找

错误总数= 0

致命错误总数= 0

这两行的问题是“错误”之后的空格可能因报告而异。 另一个问题是错误的数量(在这种情况下是0)在同一个单元格中。

我想要做的是find这两行,并返回错误的数量。 这是我的代码到目前为止。 我知道它缺less一些东西,也没有工作。 我尝试了很多没有运气的正则expression式。

任何帮助,将不胜感激。

预先感谢大家。

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

所以我会开始说,你的正则expression式正在寻找“总数offatal错误”或“总的错误数”,因为你没有空间后的“。 这可以解决这个问题。

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

这就是我将要使用的RegEx。 在这里看到它的行动

说实话,我不会依靠Excel来find它。 我会告诉PowerShellfind它,这就是我要做的:

 $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" } 

结果(通过testing电子表格准确设置):

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

将单元格值更改为错误后有3个空格,并将该数字设置为2,并将致命错误设置为0.结果:

 Number of errors found = 2 No fatal errors found 

编辑:好的,所以开关可能会让人困惑,我想如果你不熟悉它。 这是另一个循环,它的工作原理是这样的:

 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语句中的单元格是否包含“致命”的单词。 如果是这样,则将匹配的文本添加到$ FatalErrorsvariables。 如果它没有致命的话,那么它会进入默认状态,并将匹配添加到$ Errors。 匹配的文本是string末尾的数字。