Diretórios contendo colchetes [] no nome que está sendo excluído no Powershell

0

Usando o Powershell pela primeira vez aqui, então, por favor, seja fácil comigo ...

Eu escrevi um script que verifica um diretório e, para qualquer diretório dentro que esteja vazio, ele deve ser excluído. O problema que estou tendo é com diretórios contendo brakets - > [] no nome do diretório. Mesmo que o diretório não esteja vazio, ele ainda está sendo excluído. Alguém pode ajudar? Aqui está o código que estou usando:

$path = "C:\path\to\directory"
Get-ChildItem -Path $path -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

Eu não entendo completamente o código acima, achei online. Mas está funcionando para diretórios que não possuem os colchetes.

Para um diretório com o nome de " SummerPhotos " que contém um arquivo, o diretório não é excluído. - > Bom

Para um diretório vazio, ele é excluído. - > Bom

Para um diretório chamado " SummerPhotos [2009] ", ele está sendo excluído mesmo que contenha um arquivo. - > Mau

Eu pesquisei no Google e li que o powershell trata os colchetes como curingas, mas não sei como contornar isso. Qualquer ajuda seria apreciada.

Obrigado!

    
por D. Hill 06.08.2017 / 13:31

1 resposta

3
  • No PowerShell Get-ChildItem, o [] denota um intervalo, para evitar isso, não use -Path , mas -LiteralPath dentro do Where-Object
  • Para evitar possíveis irritações com $env:path escolha um diferente nome da variável.
$Mypath = "C:\path\to\directory"
Get-ChildItem -Path $Mypath -Recurse -Force | 
  Where-Object { $_.PSIsContainer -and (Get-ChildItem -LiteralPath $_.FullName -Recurse -Force | 
                                        Where-Object { !$_.PSIsContainer }) -eq $null } | 
    Remove-Item -Force -Recurse -Confirm

Em versões mais recentes do PowerShell, você pode usar Get-ChildItem parameters -Directoy e -File em vez de Where {$_.PSIsContainer}

$Mypath = "C:\path\to\directory"
Get-ChildItem -Path $Mypath -Recurse -Force -Directory -EA 0 | 
  Where-Object { (Get-ChildItem -LiteralPath $_.FullName -Recurse -Force -File -EA 0 ) -eq $null } | 
    Remove-Item -Force -Recurse -Confirm
  • -EA 0 é uma abreviação de -ErrorAction SilentlyContinue
  • durante o teste, sugiro usar -WhatIf ou -Confirm no cmdlet Remove-Item
por 06.08.2017 / 16:20

Tags