Как я исключаю импортированный список каталогов из Получить-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 файлы являются списками каталогов. Лучший способ сделать это, кажется, для использования regex, но я не знаю, что могу динамично создать выражение из .txt файла.

1
задан 26 October 2015 в 15:39
2 ответа

TesselatingHeckler был прав.

Я могу создать выражение на fly, и следующее работает. Однако мне нужно было убрать все косые черты в списке каталогов.

$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
    }
}
1
ответ дан 3 December 2019 в 17:38

Поскольку 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 }
    }
)}
3
ответ дан 3 December 2019 в 17:38

Теги

Похожие вопросы