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

4

一种方法是遍历排除列表中的项目,并且仅在路径与任何排除项不匹配时才包含路径:

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

Get-ChildItem -Path "$sitePath" -Recurse |
  where { !$_.PSIsContainer } |
  select -ExpandProperty FullName |
  where { $path = $_; -not @($excludeList | ? { $path -like $_ }) }

如果您的所有排除项目都遵循相同的模式,您还可以通过将通用模式移动到 like 调用来简化排除列表:

$excludeList = @('Custom','Download','Portal','web.config')

Get-ChildItem -Path "$sitePath" -Recurse |
  where { !$_.PSIsContainer } |
  select -ExpandProperty FullName |
  where { $path = $_; -not @($excludeList | ? { $path -like "$sitePath\$_*" }) }
于 2013-07-30T23:17:20.170 回答
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如果您尝试与-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 回答