首页 > 解决方案 > 在 powershell 中使用 excel com 对象提取单元格值的问题

问题描述

我正在编写一个脚本,用于扫描 Excel 文件中的每个单元格以查找 PII。我已经完成了大部分工作,但我遇到了两个可能相关的问题。

首先,我不相信“Do”循环按预期执行。这里的目标是,如果单元格中的文本与正则表达式字符串匹配,则使用位置信息创建一个 PSCustomObject,然后使用该对象向 csv 文件添加一行。

似乎循环正在为每个文件运行,无论它是否实际找到匹配项。

另一个问题是我似乎无法真正提取匹配单元格的单元格值。我尝试了几种不同的变量和方法,最近的尝试是“$target.text”,但变量的值始终为空。

这几天我一直在绞尽脑汁,但我相信一旦我看到它就会很明显。

这里的任何帮助将不胜感激。

谢谢。

$searchtext = "\b(?!0{3}|6{3})([0-6]\d{2}|7([0-6]\d|7[012]))([ -]?)(?!00)\d\d\3(?!0000)\d{4}\b"
$xlsFiles = Get-ChildItem $searchpath -recurse -include *.xlsx, *.xls, *.xlxm | Select-object -Expand FullName
$Excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $false;
$excel.AskToUpdateLinks = $false;
foreach ($xlsfile in $xlsfiles) {
Write-host (Get-Date -f yyyymmdd:hhmm) $xlsfile
try{
      $Workbook = $Excel.Workbooks.Open($xlsFile, 0, 0, 5, "password")
     }
Catch {
    Write-host $xlsfile 'is password protected. Skipping...' -ForegroundColor Yellow
    continue
} 

ForEach ($Sheet in $($Workbook.Sheets)) {
            $i = $sheet.Index
            $Range = $Workbook.Sheets.Item($i).UsedRange
            $Target = $Sheet.UsedRange.Find($Searchtext)
            $First = $Target
            Do {
                  $Target = $Range.Find($Target)
                  $Violation = [PSCustomObject]@{
                        Path       = $xlsfile
                        Line       = "SSN Found" + $target.text
                        LineNumber = "Sheet: " + $i
                  }
                  $Violation | Select-Object Path, Line, LineNumber | export-csv $outputpath\$PIIFile -append -NoTypeInformation
            }
            While ($NULL -ne $Target -and $Target.AddressLocal() -ne $First.AddressLocal())
      }
      $Excel.Quit()
}

标签: excelpowershellloopscom

解决方案


弄清楚了。只是循环中逻辑错误的一个简单案例。感谢所有看到这个的人。


推荐阅读