2017-08-30 54 views
0

我有一个脚本搜索字符串(在这种情况下“结束程序”)。然后它遍历文件夹中的每个文件并输出任何不包含该字符串的文件。使用txt文件作为列表PowerShell阵列/变量

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

当前代码:

$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 
} 

这是仅显示有问题的区域中的代码的简化版本。我想把“结束程序”和另一个字符串“结束”放在一个文本文件中。

以下是该文件的内容是什么样子:

 
*End program*,*Start* 
+0

因此,基本上你想要使用一些搜索条件的文件,并且你想枚举所有不包含这些条款的文件? –

+0

我想你可以使用'Get-Content'从文本文件中获取值。您只需要知道文本文件的名称或名称的模式,并使用'Get-ChildItem'来扫描文本文件的目录。 –

+0

@AnsgarWiechers是的,这就是我需要做的。 – agfila

回答

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 
+0

谢谢你完美的工作! – agfila