2017-08-30 44 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