Здесь впервые используется Powershell, поэтому, пожалуйста, будьте осторожны со мной ...

Я написал скрипт, который проверяет каталог, и для любого каталога внутри него он должен быть удален. У меня проблема с каталогами, содержащими скобки -> [] в имени каталога. Даже если каталог не пустой, он все равно удаляется. Кто-нибудь может помочь? Вот код, который я использую:

$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

Я не совсем понимаю код выше, я нашел его в Интернете. Но это работает для каталогов, которые не имеют скобок.

Для каталога с именем « SummerPhotos », содержащего файл, каталог не удаляется. -> Хорошо

Для каталога, который пуст, он удаляется. -> Хорошо

Для каталога с именем SummerPhotos [2009] он удаляется, даже если он содержит файл. -> Плохо

Я погуглил и прочитал, что powershell рассматривает скобки как символы подстановки, но я не уверен, как обойти это. Любая помощь будет оценена.

Спасибо!

1 ответ1

3
  • В PowerShell Get-ChildItem [] обозначает диапазон, во избежание этого не используйте -Path но -LiteralPath внутри Where-Object
  • Чтобы избежать возможных раздражений при использовании $env:path выберите другое имя переменной.

$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

В более поздних версиях PowerShell вы можете использовать параметры Get-ChildItem -Directoy и -File вместо 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 - это сокращение от -ErrorAction SilentlyContinue
  • во время тестирования я предлагаю использовать -WhatIf или -Confirm в командлете Remove-Item

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .