Наше программное обеспечение для резервного копирования онлайн пропускает файлы и каталоги при загрузке. Это кажется случайным, но я хотел бы видеть, могу ли я сравнить список файлов в выборе к списку файлов в облаке для поиска шаблона.
Объекты в облаке доступны в .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 файла.
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
}
}
Поскольку 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 }
}
)}