Como eu excluo uma lista importada de diretórios de uma lista Get-ChildItem?

1

Nosso software de backup on-line está ignorando arquivos e diretórios ao fazer o upload. Parece aleatório, mas gostaria de ver se posso comparar uma lista de arquivos na seleção com a lista de arquivos na nuvem para procurar um padrão.

Os itens na nuvem estão disponíveis em um .csv, mas estou tendo dificuldades para gerar uma lista de arquivos na seleção de backup, excluindo outros diretórios. Aqui está o que eu tenho até agora.

$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
            }
        }

Os arquivos .txt são listas de diretórios. A melhor maneira de fazer isso parece ser usar o regex, mas não sei se posso criar dinamicamente a expressão a partir de um arquivo .txt.

    
por BadWednesday 16.10.2015 / 22:08

2 respostas

1

TesselatingHeckler estava certo.

Eu posso criar a expressão na hora e o seguinte está funcionando. Eu precisava escapar de todas as barras na lista de diretórios.

$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
    }
}
    
por 26.10.2015 / 14:42
3

Como Get-Content por padrão retorna uma coleção (ou um array , se preferir) de strings, você está comparando a string $_.FullName com uma coleção de strings.

Você pode examinar o diretório pai em relação à matriz inteira com -notcontains :

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

ou você pode comparar cada item no $colItems com o início de cada caminho com uma chamada ForEach-Object dentro do filtro Where-Object :

$childItems | Where-Object {$(
    $path = $_.FullName
    $colItems | ForEach-Object {
        if($_ -notlike "$path*"){ return $true }
    }
)}
    
por 17.10.2015 / 00:40

Tags