2012-07-19 71 views
1

我是新来的PowerShell,所以我不知道从哪里开始。我想要一个能够搜索特定字符串组合(pdf,word,excell,powerpoint,...)文件内容的脚本。Powershell:搜索文件的内容并将结果写入文本文件

我想这个剧本,但它不工作:

function WordSearch ($sample, $staining, $sampleID, $patientID, $folder) 
{ 
$objConnection = New-Object -com ADODB.Connection 
$objRecordSet = New-Object -com ADODB.Recordset 
$objConnection.Open(“Provider=Search.CollatorDSO;Extended Properties=’Application=Windows’;”) 
$objRecordSet.Open(“SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE ((Contains(Contents,’$sample’)) or (Contains(Contents,’$sampleID’) and Contains(Contents,’$staining’)) or (Contains(Contents,’$staining’) and Contains(Contents,’$patientID’))) AND System.ItemPathDisplay LIKE ‘$folder\%’”, $objConnection) 
if ($objRecordSet.EOF -eq $false) {$objRecordSet.MoveFirst() } 

while ($objRecordset.EOF -ne $true) { 
$objRecordset.Fields.Item(“System.ItemPathDisplay”).Value 
$objRecordset.MoveNext() 
} 
} 

有人能帮助我吗?

+0

为什么不使用'select-string'? – 2012-07-19 12:16:54

+0

@ C.B。因为这适用于文本文件,但是当您想在.doc或特别是.docx中搜索时,它不起作用。 – 2013-08-23 14:22:39

回答

0

你应该试试这个,但首先确保你的文件夹要开始搜索下来:(如果你想搜索你的整个计算机,从C:\开始,但我想象脚本将花费相当可观的金额时间的运行。

$Paths = @()  
$Paths = gci . *.* -rec | where { ! $_.PSIsContainer } |? {($_.Extension -eq ".doc") -or ($_.Extension -eq ".ppt") -or ($_.Extension -eq ".pdf") -or ($_.Extension -eq ".xls")} | resolve-path 

这将检索的文件类型的所有文件路径,如果您有Microsoft Office 2007或以上,你可能需要添加搜索“的.xlsx”或“.DOCX”或“ .pptx“

然后,您可以开始查看这些文件以查找”特定字符串组合

array = @() 
foreach($path in $Paths) 
{$array += Select-String -Path $Path -Pattern "Search String"} 

这将为您提供该字符串在这些文件中存在的所有行和路径。由于微软加密文件,你得到的实际行输出可能会有点失真。使用$array | get-member -MemberType Property可以找到您可以编入索引的项目,并使用Select-object命令行工具将这些项目取出。

+0

这对于文本文件,xls等工作正常......但在docx上使用它并且不起作用。 – 2013-08-23 14:23:52

+0

为什么不呢?你有没有用文本编辑器查看过docx文件?所有的文本仍然在文件中,它不在一些神奇的地方。 Docx在格式化,图片等方面有很多额外的元数据。但是所有文字仍然可以搜索。尝试一下。 – Cole9350 2013-08-23 15:01:22

+0

你说我的系统上的.doc是真的,我能够看到原始文本都与其他所有符号和垃圾混合在一起,但这不适用于我的.docx文件 – 2013-08-23 15:29:35