如何从 Get-ChildItem 列表中排除导入的目录列表?

如何从 Get-ChildItem 列表中排除导入的目录列表?

我们的在线备份软件在上传时会跳过文件和目录。这似乎是随机的,但我想看看是否可以将所选文件列表与云中的文件列表进行比较以寻找模式。

云中的项目以 .csv 格式提供,但我在排除其他目录的同时,难以生成备份选择中的文件列表。以下是我目前所得到的。

$colSelection = get-content "c:\scripts\selection.txt"
$colExclusion = get-content "c:\scripts\exclusion.txt"
foreach ($folder in $colSelection) {
            $colItems = (Get-ChildItem $folder -recurse -force | where-object {(-not $_.PSIsContainer) -and ($_.FullName -notlike $colExclusion)})
            foreach ($item in $colItems) {
                Add-Content -Path c:\scripts\testlist.txt -Value $item.FullName
            }
        }

.txt 文件是目录列表。最好的方法似乎是使用正则表达式,但我不知道是否可以从 .txt 文件动态创建表达式。

答案1

由于Get-Content默认情况下返回一个集合(或大批,如果你愿意的话)的字符串,您正在将$_.FullName字符串与字符串集合进行比较。

您可以使用以下命令查看整个数组的父目录-notcontains

$childItems = Get-ChildItem $folder -Recurse -Force 
$childItems | Where-Object {$colExclusion -notcontains $_.Directory.FullName -and (-not $_.PSIsContainer)}

或者您可以将每个项目与$colItems每个路径的开头与过滤器ForEach-Object内部的调用进行比较Where-Object

$childItems | Where-Object {$(
    $path = $_.FullName
    $colItems | ForEach-Object {
        if($_ -notlike "$path*"){ return $true }
    }
)}

答案2

TesselatingHeckler 是对的。

我可以即时创建表达式,并且以下内容有效。不过我确实需要转义目录列表中的所有斜线。

$colSelection = get-content "c:\scripts\selection.txt"
#$colExclusion = get-content "c:\scripts\exclusion.txt"
$colExclusion = "($((get-content "c:\scripts\exclusion.txt") -join '|' ))"
foreach ($folder in $colSelection) {
    $colItems = (Get-ChildItem $folder -recurse -force | where-object {$_.FullName -notmatch $colExclusion})
    foreach ($item in $colItems) {
        Add-Content -Path c:\scripts\testlist.txt -Value $item.FullName
    }
}

相关内容