使用 PowerShell 脚本模拟 Windows 通配符搜索

时间:2021-03-10 13:09:14

标签: powershell

需要查找文档中是否包含任何 IP 地址。 我们是否有任何 PowerShell 脚本/命令可以为任何文件类型执行此操作。 我发现很少有脚本仅适用于 .txt 文件。

1 个答案:

答案 0 :(得分:0)

要在任何文件类型中搜索 IP 地址,您需要解决两个基本问题。

一,PowerShell 需要对任何文件类型的内容执行搜索。

二、搜索需要定义一个IP地址。


对于第一个问题,可以使用 Windows Search 搜索常见文件类型的内容。但是,Windows Search 没有搜索 IP 地址的实用方法。它擅长搜索人类可读的文本,如“苹果派”。它没有适用于 IP 地址的有用的 wild carddeclarative 语法。就 Windows 搜索而言,您最好搜索“IP 地址”。


对于第二个问题,有很多字符串可以作为 IP 地址:

  • 172.16.0.1
  • 192.0.2.0/24
  • 10.x.x.x
  • 2001:0db8:0000:0000:0000:8a2e:0370:7334
  • 2001:db8::8a2e:370:7334

通常,开发解决方案首先要定义适当的正则表达式。你可以在网上找到一些帮助。但是要涵盖所有符合“任何 IP 地址”的条件需要工作。


您所描述的场景通常称为eDiscovery。您可能会搜索可以满足您要求的产品。


为了让其他人可以从我的研究中受益,这里有一个在 PowerShell 中使用 Windows 搜索的工作示例。在这里,我在 PowerShell 目录中搜索 C:/Users/Michael/Stack Overflow。注意搜索词比较简单,这是全文搜索的局限性。

确保向下滚动并复制整个脚本。

# Adapted from 
# https://docs.microsoft.com/en-us/windows/win32/search/-search-sample-wsfromscript
# and 
# https://github.com/microsoft/Windows-classic-samples/blob/master/Samples/Win7Samples/winui/WindowsSearch/WSFromScript/QueryEverything.vbs

# See 
# https://docs.microsoft.com/en-us/windows/win32/search/-search-sql-folderdepth
# for information on searching specific directories. 

# See
# https://docs.microsoft.com/en-us/windows/win32/search/-search-sql-contains
# for information on searching the body of a document. 

# See 
# https://docs.microsoft.com/en-us/windows/win32/properties/core-bumper
# for potential properties to return. 


# Create the ADO objects. 
$objConnection = New-Object -ComObject ADODB.Connection 
$objRecordSet  = New-Object -ComObject ADODB.Recordset 

# Windows Search connection string. 
$objConnection.Open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';") 

# SQL SELECT statement specifies what properties to return, you can add more if you want
#     FROM - use SystemIndex for a local query or MACHINENAME.SystemIndex for remote
#     WHERE - specify restrictions including SCOPE and other conditions that must be true

# To add scope restriction append "WHERE SCOPE='file:c:/users'" to the query string.

# SQL Query
$objRecordSet.Open("SELECT System.ItemName, System.ItemTypeText, System.Size, System.ItemPathDisplay FROM SystemIndex WHERE SCOPE='file:C:/Users/Michael/Stack Overflow' AND CONTAINS('PowerShell')", $objConnection) 

try 
{
    $objRecordSet.MoveFirst()
    do {
        # Access the column values that were specified in the SELECT statement here
        Write-Host $objRecordset.Fields.Item("System.ItemName").Value
        Write-Host $objRecordset.Fields.Item("System.ItemTypeText").Value
        Write-Host $objRecordset.Fields.Item("System.Size").Value
        Write-Host $objRecordset.Fields.Item("System.ItemPathDisplay").Value
        Write-Host 
        $objRecordset.MoveNext()
    } until ($objRecordset.EOF) 
}
finally 
{
    $objRecordset.Close()
    Remove-Variable -Name objRecordset
    $objConnection.Close()
    Remove-Variable -Name objConnection 
}
# Script End 

样品运行。

PS > & '.\QueryEverything 03.ps1'

...

Stack Overflow Notes.txt
Text Document
3606
C:\Users\Michael\Stack Overflow\in-powershell-can-you-write-host-the-invocation-and-arguments-for-an-external-co\Stack Overflow Notes.txt

Stack Overflow Answer.txt
Text Document
1720
C:\Users\Michael\Stack Overflow\mimic-windows-wildcard-search-using-powershell-script\Stack Overflow Answer.txt

Stack Overflow Notes.txt
Text Document
23310
C:\Users\Michael\Stack Overflow\mimic-windows-wildcard-search-using-powershell-script\Stack Overflow Notes.txt

请注意,“模拟 Windows 通配符搜索”在实践中是指文件名。除了像这样的尾随星号外,我不知道有什么方法可以对文档正文使用通配符:

CONTAINS('PowerSh*')
相关问题