我对PowerShell还是有点陌生,所以我将不胜感激。 我试图将PS脚本放在一起,以便在将文件从一个网络传输到另一个网络之前搜索文件中的敏感词。像“分类”和我可以添加到文本文件中的词库中的多个其他词一样,每次都会更新代码
现在我被迫使用PS 2 Windows 7和Server 2008
Select-String -Path e:\transfer_folder\*.* -pattern Classified,restricted
然后我可以获取单词列表中任何匹配项的输出,以便我可以找到它们。我正试图通过数百个文档页面来加速我的搜索,我称之为“脏词搜索”,所以我不会放置不应在错误的网络上显示的内容。
答案 0 :(得分:2)
您有正确的想法。通常可以调用powershell中的-Pattern
标签来使用正则表达式。如果您从未使用过正则表达式,请查看此beginner's guide to using regex pattern matching。您可能想要的是一组变量,可用于动态选择那些敏感关键字。
简短而简单的答案是,您想使用管道将模式选项分开,然后将其作为字符串传递。
Select-String -Path e:\transfer_folder\*.* -pattern "Classified|Restricted"
此外,您可能要考虑在文件级别执行此操作,而不是像那样仅将所有内容导入willynilly。我会选择类似的东西:
$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”表示为“ |”。因此,您有两种选择可以在逻辑上做到这一点:
$pattern = "Classified|Forbidden|Death|Danger"
脚本的全部目的是不必重复做一遍,对吗?因此,您可能希望将其封装在函数或其他内容中。或者,也许您想从文本文件中获取单词?您可能会像: (可能需要一些调整)
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\