Get-ChildItem Where-Object -notlike $ array-有没有办法做到这一点?

时间:2019-01-07 16:06:10

标签: powershell

我写了一个脚本,该脚本将递归指定的文件夹并对其中的文件进行一些分析。我需要在分析中排除指定的子文件夹。此排除列表会根据要分析的基本文件夹而变化。我的脚本使用了如下长模式:

Get-ChildItem -File -Recurse $source_folder | 
Where-Object {
    $_.FullName -notlike "*\folder_name0\*" -and 
    $_.FullName -notlike "*\folder_name1\*" -and 
    $_.FullName -notlike "*\folder_name2\*" -and 
    $_.FullName -notlike "*\folder_name3\*" -and 
    $_.FullName -notlike "*\folder_name4\*"
}

但这不是很可重用。我希望能够将例外列表存储在.CSVs中,并根据要分析的文件夹集调用所需的例外列表。我想做的是这样的:

$exception_list = Import-CSV .\exception_list
Get-ChildItem -File -Recurse $source_folder | 
Where-Object {$_.FullName -notlike $exception_list}

但这不起作用。我怀疑是因为我无法在数组中的元素之间指定“与”或“或”。我确实曾简要考虑过尝试使用foreach($exception in $exception_list){$argument += "$_.FullName -notlike $exception -and"}动态创建整个参数,但是由于您仍然必须删除最后一个“和”,所以这变得非常愚蠢和复杂。

有有效的方法吗?

1 个答案:

答案 0 :(得分:2)

这将构建一个要排除的部分名称的数组,并使用该数组来构建用于-notmatch测试的正则表达式OR。

$ExcludedDirList = @(
    'PSES-'
    'vscode'
    'Test_'
    )
# regex uses the pipe symbol as the logical "OR"
$RegexExcludedDirList = $ExcludedDirList -join '|'

$Results = Get-ChildItem -Path $env:TEMP -File -Recurse |
    Where-Object {
        $_.DirectoryName -notmatch $RegexExcludedDirList
        }