在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末尾的数字。