1

次の PowerShell スクリプトをより汎用的にしようとしています。固定リストではなく、除外の配列を渡したいです。以下の部分的な解決策を除いて、これを行う方法がわかりません。

オリジナル

これは、ワイルドカード ファイルまたはフォルダーのリストを除く、パス内のすべてのファイルを取得します。

        Get-ChildItem -Path  "$sitePath" -Recurse | `
        where {!$_.PSIsContainer } | `
        Select -ExpandProperty FullName | `
            Where {$_ -notlike "$sitePath\Custom\*"} | `
            Where {$_ -notlike "$sitePath\Download\*"} | `
            Where {$_ -notlike "$sitePath\Temp\*"} | `
            Where {$_ -notlike "$sitePath\Portal\*"} | `
            Where {$_ -notlike "$sitePath\web.config*"} | `            
            SELECT $_

部分的な解決

これは私が思いついた最高のものです。$excludeList というワイルドカードの配列を作成できますが、制限があり、少し遅くなります。

        $excludeList = @("$sitePath\Custom\*",
                "$sitePath\Download\*",
                "$sitePath\Portal\*",
                "$sitePath\web.config*")

        Get-ChildItem -Path  "$sitePath" -Recurse | `
        where {!$_.PSIsContainer } | `
        Select -ExpandProperty FullName | `
            Where {$_ -notlike $excludeList[0]} | `
            Where {$_ -notlike $excludeList[1]} | `
            Where {$_ -notlike $excludeList[2]} | `
            Where {$_ -notlike $excludeList[3]} | `
            Where {$_ -notlike $excludeList[4]} | `
            Where {$_ -notlike $excludeList[5]} | `
            Where {$_ -notlike $excludeList[6]} | `
            Where {$_ -notlike $excludeList[7]} | `
            Where {$_ -notlike $excludeList[8]} | `
            Where {$_ -notlike $excludeList[9]} | `
            Where {$_ -notlike $excludeList[10]} | `
            SELECT $_

配列を where 句に渡すより良い方法はありますか? 私が見つけたすべてのソリューションは、ワイルドカード以外の一致のみを許可します。

誰かが助けてくれることを願っています!

4

3 に答える 3

2

代わりに正規表現を使用する場合は、これを大幅に簡素化できます。

$excludeList = [regex]::Escape("$sitePath\Custom\"), 
               [regex]::Escape("$sitePath\Download\"),
               [regex]::Escape("$sitePath\Temp\") -join "|"
Get-ChildItem $sitePath -Recurse | `
    where {!$_.PSIsContainer } | `
    Select -ExpandProperty FullName | `
        Where {$_ -notmatch $excludeList}

なぜ末尾Select $_に があるのか​​ わかりませんが、AFAICT は不要です。

于 2013-07-24T15:45:21.023 に答える
0

配列と比較しようとしている場合は-contains、and演算子を試す必要があります。-notcontains

$array = "name1","name2","name3"

#This will return false
$array -contains "name"

#this will return true
$array -notcontains "name"
于 2013-07-24T14:11:09.157 に答える