我写了一个脚本,该脚本将递归指定的文件夹并对其中的文件进行一些分析。我需要在分析中排除指定的子文件夹。此排除列表会根据要分析的基本文件夹而变化。我的脚本使用了如下长模式:
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"}
动态创建整个参数,但是由于您仍然必须删除最后一个“和”,所以这变得非常愚蠢和复杂。
有有效的方法吗?
答案 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
}