在tthell数组/变量

时间:2017-08-30 21:15:32

标签: arrays powershell csv text-files powershell-v3.0

我有一个搜索字符串的脚本(" End program"在这种情况下)。然后它遍历文件夹中的每个文件,并输出任何不包含该字符串的文件。

当短语是硬编码时,它可以很好地工作,但我想通过创建一个文本文件来保存字符串,使其更加动态。将来,我希望能够在文本文件中添加字符串列表。我无法在任何地方在线找到这个,所以感谢任何帮助。

当前代码:

$Folder = "\\test path"
$Files = Get-ChildItem $Folder -Filter "*.log" |
         ? {$_.LastWriteTime -gt (Get-Date).AddDays(-31)} 

# String to search for within the file
$SearchTerm = "*End program*"

foreach ($File in $Files) {
    $Text = Get-Content "$Folder\$File" | select -Last 1

    if ($Text | WHERE {$Text -inotlike $SearchTerm}) {
        $Arr += $File
    }
}
if ($Arr.Count -eq 0) {
   break
}

这是代码的简化版本,仅显示有问题的区域。我想把#34; End program"和另一个字符串"结束"在文本文件中。

以下是该文件的内容:

*End program*,*Start*

1 个答案:

答案 0 :(得分:1)

如果您想检查文件是否包含(或不包含)多个给定的术语,您最好使用正则表达式。阅读文件中的术语,将其转义,然后将其加入alternation

$terms = Get-Content 'C:\path\to\terms.txt' |
         ForEach-Object { [regex]::Escape($_) }

$pattern = $terms -join '|'

文件中的每个术语都应该在一个单独的行中,没有前导或尾随的通配符。像这样:

End program
Start

通过它,您可以检查文件夹中的文件是否包含以下任何条款:

Get-ChildItem $folder | Where-Object {
    -not $_.PSIsContainer -and
    (Get-Content $_.FullName | Select-Object -Last 1) -notmatch $pattern
}

如果要检查整个文件而不是仅检查其最后一行更改

Get-Content $_.FullName | Select-Object -Last 1

Get-Content $_.FullName | Out-String