首页 > 解决方案 > 使用 powershell 进行敏感词搜索

问题描述

我对 PowerShell 有点陌生,所以我将不胜感激。我正在尝试将 PS 脚本放在一起,以便在将文件从一个网络传输到另一个网络之前搜索敏感词。像“分类”和其他多个单词,我可以将它们添加到文本文件中的单词库中,每次都更新代码

现在我被迫使用 PS 2 windows 7 和 server 2008

Select-String -Path e:\transfer_folder\*.* -pattern Classified,restricted

然后我可以获得单词列表中任何命中的输出,以便我可以找到它们。我正在尝试使用我喜欢称之为脏字搜索的方式来加快搜索数百页文档的速度,因此我不会将不应该放在错误网络上的内容。

标签: powershellwindows-7windows-server-2008-r2

解决方案


你有正确的想法。-Pattern通常可以调用 powershell 中的tack 来使用正则表达式。如果您从未使用过正则表达式,请查看此使用正则表达式模式匹配的初学者指南。您可能想要的是一组变量,您可以使用它们来动态挑选那些敏感关键字。

简短而简单的答案是您想使用管道来分隔模式选项,并将其作为字符串传递。

Select-String -Path e:\transfer_folder\*.* -pattern "Classified|Restricted"

此外,您可能想考虑在文件级别执行此操作,而不是像那样随意导入所有内容。我会选择类似的东西:

$files = @(Get-ChildItem -Path E:\transfer_folder\ -Filter "*.txt|*.etc").FullName

(该@符号表示您将输出作为数组获取。这.FullName意味着您仅从命令生成的对象中选择 FullName 字段。)

然后您可以单独处理每个文件,例如:

Foreach ($file in $files) {
   Write-Host "Processing $file"
   echo (Select-String -Path $file -Pattern $pattern) 
}

我喜欢 powershell 的原因之一是执行这些类型的匹配操作相对容易。如果您深入研究正则表达式,您会注意到您可以将“OR”表示为“|”。因此,您有两种选择可以在逻辑上执行此操作:

  1. 硬着头皮写出来

$pattern = "Classified|Forbidden|Death|Danger"

  1. 动态执行

编写脚本就是不必多次做某事,对吗?因此,您可能希望将其封装在一个函数或其他东西中。或者,也许您想从文本文件中获取您的文字?你可以像:(可能需要一些调整)

function Get-ForbiddenWords ([string[]]$words, [string]$folder) {
   ForEach ($word in $words) {
      $pattern += "$word|" 
    }
    #remove trailing pipe
    $pattern -replace ".$"
    $files = @(Get-ChildItem -Path $folder -Filter "*.txt|*.etc").FullName
    Foreach ($file in $files) {
       Write-Host "Processing $file"
       echo (Select-String -Path $file -Pattern $pattern) 
    }
}

现在你可以把它放在你的 powershell 配置文件中并调用它

Get-ForbiddenWords -words secret dangerous whatever -folder E:\transfer_folder\


推荐阅读