在Powershell中查找Excel文件的内容

我目前正在研究一个相当大的PowerShell脚本。 但是,我被困在一个部分。 问题如下。

我有相同的文件名称的各种报告,他们只是在最后有一个不同的时间戳。 在报告中,我有一个字段显示从何时到何时该报告来自的date。

—> 2/1/2015 5:00:00 AM至3/1/2015 5:00:00 AM <—这就是它的样子。

该字段随机放置在Excel工作表上。 在A5到Z16的范围内差不多。 我想要的脚本是:

阅读文件 / 检查date的单元格的范围,如果finddate,它符合我的search条件,closures表并将其移动到不同的文件夹 / 如果date不匹配,closures并检查下一个XLS文件

这是我到目前为止:

$File = "C:\test.XLS" $SheetName = "Sheet1" # Setup Excel, open $File and set the the first worksheet $Excel = New-Object -ComObject Excel.Application $Excel.visible = $true $Workbook = $Excel.workbooks.open($file) $Worksheets = $Workbooks.worksheets $WorkSheet = $WorkBook.sheets.item($SheetName) $SearchString = "AM" #just for test purposes since it is in every report $Range = $Worksheet.Range("A1:Z1").EntireColumn $Search = $Range.find($SearchString) 

如果你想要search整个列的A到Z,你可以指定范围:

 $Range = $Worksheet.Range("A:Z") 

然后,你应该可以执行一个$Range.Find($SearchText) ,如果发现文本,它会吐出它find的第一个单元格,否则它不会返回任何内容。 因此,像你一样开始Excel,然后做一个ForEach循环,在里面打开一个工作簿,search你的文本,如果发现closures它,移动它,停止循环。 如果找不到closures工作簿,并移动到下一个文件。 以下工作对我来说很好:

 $Destination = 'C:\Temp\Backup' $SearchText = '3/23/2015 10:12:19 AM' $Excel = New-Object -ComObject Excel.Application $Files = Get-ChildItem "$env:USERPROFILE\Documents\*.xlsx" | Select -Expand FullName $counter = 1 ForEach($File in $Files){ Write-Progress -Activity "Checking: $file" -Status "File $counter of $($files.count)" -PercentComplete ($counter*100/$files.count) $Workbook = $Excel.Workbooks.Open($File) If($Workbook.Sheets.Item(1).Range("A:Z").Find($SearchText)){ $Workbook.Close($false) Move-Item -Path $File -Destination $Destination "Moved $file to $destination" break } $workbook.close($false) $counter++ } 

我甚至有足够的雄心壮志在这里添加一个进度条,这样你就可以看到有多less文件可以看,有多less文件完成,以及它正在查看的文件。

现在,这一切都假定你确切地知道该单元格中的string(至less是部分)。 如果你错了,那么这是行不通的。 检查不明确的事情需要更长的时间,因为您不能使用Excel的匹配function,必须让PowerShell检查每个单元格中的每个单元格。