Удаление «пустых» папок - PullRequest
0 голосов
/ 10 апреля 2020

Отредактировано для наглядности. Я хочу запустить скрипт для удаления пустых папок и подпапок в моем старом каталоге musi c, но я столкнулся с проблемой, которую не могу понять, поскольку я новичок в этом. Некоторые из папок были удалены, и если я создам новую пустую папку, она будет удалена. Кажется, проблема в том, что в некоторых папках есть файлы, которые не отображаются в Windows Explorer, но обнаруживаются сценарием, о чем свидетельствует ошибка, показанная ниже. Кроме того, я могу удалить папки вручную, я просто пытаюсь избежать нескольких часов удаления сотен папок и узнать что-то в пути.

Поскольку я новичок в переполнении стека, я не могу опубликовать изображения встроены, поэтому эти ссылки относятся к изображениям Windows окна обозревателя с пустой папкой изображение пустой папки в Windows Explorer и снимком экрана с VS Code, автоматически заполняющим файлы, которые не должны существовать автозаполнение невидимых файлов . Я не могу найти информацию об ошибках разрешения, которые продолжают появляться. Я установил, что папка root и отдельные подпапки будут принадлежать всем с полным контролем на моей машине, но это не имеет значения. Я также запускаю PowerShell от имени администратора, но это все равно не имеет значения. Это личный проект, в котором я надеюсь учиться, и я не собираюсь использовать этот бесплатный сервис для написания кода, мне просто нужно немного помочь понять, что происходит.

Проблема, похоже, больше связана с невидимыми файлами и их правами на фактическое удаление папок.

Это различные скрипты, которые я нашел по всему inte rnet, но они не влияют на папки

$MusicPath = "C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy"
do {
    $dirs = Get-ChildItem $MusicPath -directory -recurse | Where-Object { (Get-ChildItem $_.fullName -Force).count -eq 0 } | Select-Object -expandproperty FullName
    $dirs | Foreach-Object { Remove-Item -force -recurse }
  } while ($dirs.count -gt 0)
Get-ChildItem $MusicPath -Directory | Where-Object {-NOT $_.GetFiles("*","AllDirectories")} | Remove-Item 

Этот скрипт взят из комментария ниже, но не удалось удалить пустую папку из-за той же ошибки разрешения, и она определила папку с 20 mp3-файлами как пустую

$Parent = 'C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy'  # CHANGE THIS TO YOUR DESIRED FOLDER!!! #
$Dirs = Get-ChildItem -Path $Parent -directory -Recurse
foreach ($item in $Dirs) {   
    if ((get-childitem $item.Fullname | measure-object | select -ExpandProperty count) -eq '0') {
    write-verbose -Message "The folder $($item.Fullname) is empty" -Verbose
    remove-item $item.Fullname -Verbose
    }
}

Эта строка должна была проверить, могу ли я удалить папки напрямую

Remove-Item -Path "C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy\Clinton Sparks\SXSW 2009 Showcasing Artists\"

И это привело к следующему сообщению об ошибке, я только показал здесь одно, но оно повторяется для каждого невидимого файла.

Remove-Item: Невозможно удалить элемент C: \ Users \ Lewis \ Desktop \ Extraction_Test \ Music_Copy \ Clinton Sparks \ SXSW 2009 Showcasing Artists \ AlbumArtSmall.jpg: У вас недостаточно прав доступа для выполнения этой операции. В D: \ Respositories \ BatchFiles \ Delete_Empties.ps1: 18 char: 1 + Remove-Item -Path "C: \ Users \ Lewis \ Desktop \ Extraction_Test \ Music_Copy \ ... + ~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~ + CategoryInfo: PermissionDenied: (AlbumArtSmall.jpg: FileInfo) [Remove-Item], IOException + FullyQualifiedErrorId: RemoveFileSystemItemUnAuthorizedAccess, Microsoft.PowerShell.Commands.RemoveItem26om25 * 10

* Эта строка ниже удалит папку, но когда я добавлю переключатель -force к одному из вышеуказанных кодов, он все равно ничего не сделает.
remove-item -force -recurse -path "C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy\Clinton Sparks\SXSW 2009 Showcasing Artists\"

Я попытался использовать этот код для перемещения пустых папок в другой каталог, но опять-таки он ничего не сделал с задействованными папками

Get-ChildItem -Path $MusicPath -Recurse | Move-Item -Destination $NewAlbumPath

Я также безуспешно пробовал этот файл .bat, я добавил ключ / S после rmdir, но затем он попытался удалить папки с файлами, которые я хочу сохранить.

@echo off
    setlocal enableextensions disabledelayedexpansion
    for /f "delims=" %%a in ('dir C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy /s /b /ad ^| sort /r') do 2>nul rmdir "%%~fa"

Надеюсь, это понятнее, и моя проблема имеет смысл. Если кто-то может указать мне ресурс, который может помочь мне Если решить эту проблему, это будет шагом вперед.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Спасибо за комментарии и предложения, теперь я получил его работать более или менее. Основной проблемой были скрытые системные файлы в каждой папке. После того, как я изменил параметры в Windows Explorer, я использовал пакетный файл, чтобы удалить их, прежде чем пробежаться и удалить пустую папку. Надеюсь, это поможет кому-то в будущем. Это сценарий PowerShell, который я использовал для перемещения нужных файлов в нужную папку.

# A script to run through each artist and album folder in a music folder 
# and move the mp3s which are from one of the SXSW showcasing artists 
# collections to a combined folder.

$MusicPath = "H:\Music Archive\*\SXSW 20** Showcasing Artists\"
$NewAlbumPath = "C:\Users\Lewis\Desktop\SXSW"

get-item $MusicPath | foreach ($_){$oldpath = $_.FullName; robocopy $oldpath $NewAlbumPath /MOVE /E}

Это пакетный сценарий, который я использовал для удаления всех скрытых системных файлов, которые создавали сценарий удаления. игнорировать «пустые» папки

:: This script will delete all the hidden and hidden system files from 
:: the selected directory and sub-directories
del "H:\Music Archive" /A:H /S /Q

Этот сценарий используется для сквозного go удаления и удаления пустых каталогов и подкаталогов. Нужно будет запустить пару раз, чтобы убедиться, что все ловит. Это код, упомянутый выше в ответе, который сначала не работал из-за скрытых системных файлов. Он помечает каталог как пустой, если в нем еще есть файлы, но не удаляет его при правильной работе.

# This is a script to remove the empty folders after the music 
# files have been moved

$Parent = "H:\Music Archive"
$Dirs = Get-ChildItem -Path $Parent -directory -Recurse

foreach ($item in $Dirs) {   
    if ((get-childitem $item.Fullname | measure-object | select -ExpandProperty count) -eq '0') {
    write-verbose -Message "The folder $($item.Fullname) is empty" -Verbose

    remove-item $item.Fullname -Verbose
    }
}
0 голосов
/ 10 апреля 2020
$Parent = 'D:\MySuperCoolMusic'  # CHANGE THIS TO YOUR DESIRED FOLDER!!! #
$Dirs = Get-ChildItem -Path $Parent -directory -Recurse

foreach ($item in $Dirs) {   
    if ((get-childitem $item.Fullname | measure-object | select -ExpandProperty count) -eq '0') {
    write-verbose -Message "The folder $($item.Fullname) is empty" -Verbose

    remove-item $item.Fullname -Verbose
    }
}

Возможно, вам придется запустить его пару раз, пока он ничего не найдет. Пустая папка внутри папки приведет к тому, что родитель не будет пустым. Таким образом, первый проход удаляет эту пустую папку, а второй проход удаляет теперь пустой родительский элемент.

Удаляет пустые папки. Что касается этих файлов Ghost - попробуйте включить проводник, чтобы не скрывать системные файлы. Они могут появиться тогда. Просто обязательно выключите эту опцию, когда закончите. Вы не хотите случайно удалить системный файл в будущем.

Если вы хотите принудительно удалить что-либо с помощью PowerShell:

запустите его как администратор (щелкните правой кнопкой мыши и запустите как администратор из меню Пуск), перейдите в родительский каталог, содержащий каталог, который вы хотите удалите и запустите:

remove-item -force -recurse -path "c:\whatever folder you want to remove"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...