如何使用powershell在整个excel工作簿中搜索特定字符串

如何使用powershell在整个excel工作簿中搜索特定字符串,excel,string,powershell,full-text-search,Excel,String,Powershell,Full Text Search,我需要在excel电子表格中搜索包含多个工作表的特定字符串。我正在寻找一种搜索excel文件全部内容的方法,类似于excel中的“全部查找”选项,其范围设置为工作簿,而不仅仅是工作表 如果有类似于常规文件中特定字符串的搜索字符串,那就太好了,(即) 我已经在互联网上搜索过,但没有看到太多使用powershell搜索现有excel文件内容的现有信息。我希望我能在这里得到一些指点,让我达到我的目标 非常感谢您的帮助。 谢谢 Don打开Excel 加载文件 循环浏览每个工作表 搜索范围 循环查找下一个

我需要在excel电子表格中搜索包含多个工作表的特定字符串。我正在寻找一种搜索excel文件全部内容的方法,类似于excel中的“全部查找”选项,其范围设置为工作簿,而不仅仅是工作表

如果有类似于常规文件中特定字符串的搜索字符串,那就太好了,(即)

我已经在互联网上搜索过,但没有看到太多使用powershell搜索现有excel文件内容的现有信息。我希望我能在这里得到一些指点,让我达到我的目标

非常感谢您的帮助。 谢谢 Don

打开Excel

加载文件

循环浏览每个工作表

搜索范围

循环查找下一个输出索引$Column$行

退出Excel

$File = "C:\TEST.xlsx"
$SearchString = "TEST"
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open($File)
for($i = 1; $i -lt $($Workbook.Sheets.Count() + 1); $i++){
    $Range = $Workbook.Sheets.Item($i).Range("A:Z")
    $Target = $Range.Find($SearchString)
    $First = $Target
    Do
    {
        Write-Host "$i $($Target.AddressLocal())"
        $Target = $Range.FindNext($Target)
    }
    While ($Target -ne $NULL -and $Target.AddressLocal() -ne $First.AddressLocal())
}
$Excel.Quit()

也许。假设没有全局表,则可以轻松枚举所有表。我使用上面的“选择字符串”命令,确实在文件中找到了字符串,但该文件有多个工作表,我还需要从相邻列中提取数据。我得到的结果包含一个数值,但我无法将其与任何内容联系起来。马特,对不起,我读了你说的内容,但我不知道你的确切意思。这对我有什么好处?我该怎么做?Thanks我搜索“a.b.c.d”时返回了一个excelfile.xls:328:a.b.c.d的搜索结果,第二次搜索的IP地址没有排除任何其他潜在的候选地址,但给了我多个不准确的结果:excelfile.xls:它基本上是使用通配符执行搜索。a.b.c.1*192.168.22.1将返回任何可能的变体。1、.1[0-9]我如何将搜索结果限制为搜索更具体的IP a.b.c.1?您的问题和评论在地图上到处都是。您知道自己想做什么。将其分解为多个部分是一个好的开始。但是,您不可能在一个问题中获得所有答案。您不能使用
选择字符串
搜索excel文件。它不是一个简单的文本文件。您需要使用第三方库或Excel com对象,如链接的问题显示。自从我在注释中写出了链接的答案以来,我学到了更多。现在我建议使用
ForEach($Sheet in$($Workbook.Sheets)){
进行循环,然后您可以执行
$Target=$Sheet.UsedRange.Find($SearchString)
。最好使用
UsedRange
而不是
范围(“A:Z”)
,这样您搜索的内容就不会超过您需要的范围,并且您可以确保捕获所有可能的数据。@TheMadTechnician我讨厌前一天编写的大部分代码
$File = "C:\TEST.xlsx"
$SearchString = "TEST"
$Excel = New-Object -ComObject Excel.Application
$Workbook = $Excel.Workbooks.Open($File)
for($i = 1; $i -lt $($Workbook.Sheets.Count() + 1); $i++){
    $Range = $Workbook.Sheets.Item($i).Range("A:Z")
    $Target = $Range.Find($SearchString)
    $First = $Target
    Do
    {
        Write-Host "$i $($Target.AddressLocal())"
        $Target = $Range.FindNext($Target)
    }
    While ($Target -ne $NULL -and $Target.AddressLocal() -ne $First.AddressLocal())
}
$Excel.Quit()