2016-02-29 97 views
2

我無法讓腳本正常工作。 我有三個數組。 extensions數組過濾正確。然而我的通配符數組並沒有產生我想要的結果。我究竟做錯了什麼?Where-Object和陣列未正確過濾

# Read List of Servers from flat file 
$data=Get-Content C:\myscripts\admin_servers.txt 

# Variables that will be used against search parameter 
$extensions = @(".ecc", ".exx", ".ezz", ".vvv") 
$wildcards = @("Help_*.txt", "How_*.txt", "Recovery+*") 
$exclude = @("help_text.txt", "Lxr*.exx", "help_contents.txt") 

# Loop each server one by one and do the following 
foreach ($server in $data) 
{ 
    # Search the server E:\ and all subdirectories for the following types of 
    # extensions or wildcards. 
    Get-ChildItem -path \\$server\e$ -Recurse | Where-Object { 
     (($extensions -contains $_.Extension) -or $_.Name -like $wildcards) -and 
     $_.Name -notlike $exclude 
    } 
} 
+2

'$ _名狀$ wildcards'是比較'$ _ Name'來。數組。您需要將'$ _。Name'與數組中的每個值進行比較。 –

+0

所以我需要爲每個值添加-or和 - 語句? [0],[1],[2]等?有沒有辦法來減少?我希望數組能夠工作,而不必在where子句中指定每個值。 – Refried04

+0

這樣做:'($ wildcards |%{「help_a.txt」-like $ _})。Contains($ true)'。可能有一個更簡潔的方法。我硬編碼一個文件名來測試它,但我認爲你明白了。 –

回答

3

你可以寫自己的函數:

function Like-Any { 
    param (
     [String] 
     $InputString, 

     [String[]] 
     $Patterns 
    ) 

    foreach ($pattern in $Patterns) { 
     if ($InputString -like $pattern) { 
      return $true 
     } 
    } 
    $false 
} 

然後調用它像這樣:

Get-ChildItem -path \\$server\e$ -Recurse | 
Where-Object { ` 
    (($extensions -contains $_.Extension) -or (Like-Any $_.Name $wildcards)) ` 
    -and !(Like-Any $_.Name $exclude)} 
+0

謝謝傑森。完美的作品。我喜歡這個功能。它的工作原理就像我希望我的原始腳本能夠工作。我只需要理解這個函數中的錯誤。我會做一些研究。 – Refried04

+0

很高興我能幫到你。 –

1

如果您在正則表達式中得心應手,您可以使用-Match作比較。替換爲您$Wildcards =$Exclude =線:

$wildcards = "Help_.*?\.txt|How_.*?\.txt|Recovery\+.*" 
$Exclude = "help_text\.txt|Lxr.*?\.exx|help_contents\.txt" 

然後你Where-Object符合:

Where-Object {(($extensions -contains $_.Extension) -or $_.Name -match $wildcards) -and $_.Name -notmatch $exclude} 

這應該爲你做它。 $Wildcard =匹配的解釋可在this RegEx101 link處獲得。

+0

這也適用。我只是沒有正則表達式的經驗。感謝您的有用參考。我會花一些時間來更好地理解它。 – Refried04

+0

使用正則表達式確實需要一些學習,但在試圖解析或匹配文本和模式時它們非常強大,而且與其他方法相比,它們非常快。我很高興你找到了適合你的答案! – TheMadTechnician