【问题标题】:Removing 'Empty' Folders删除“空”文件夹
【发布时间】:2020-07-23 05:55:32
【问题描述】:

为清晰起见进行了编辑。 我想运行一个脚本来删除我的旧音乐目录中的空文件夹和子文件夹,但我遇到了一个我不知道的问题,因为我是新手。一些文件夹已被删除,如果我创建一个新的空文件夹,它将被删除。问题似乎是某些文件夹中的文件未显示在 Windows 资源管理器上,但脚本可以看到,如下所示的错误证明了这一点。此外,我可以手动删除文件夹,我只是想避免数小时删除数百个文件夹并在途中学习一些东西。

由于我是 Stack Overflow 的新手,我无法内联发布图像,因此这些链接是 Windows 资源管理器窗口的图像,显​​示文件夹为空 Image of empty folder in Windows Explorer 和 VS Code 自动完成不应该的文件的屏幕截图存在autocomplete of invisible files。我似乎找不到有关不断出现的权限错误的任何信息。我已将根文件夹和各个子文件夹设置为所有人拥有,并且可以完全控制我的机器,但这并没有什么不同。我也以管理员身份运行 PowerShell,但它仍然没有区别。这是一个我希望学习的个人项目,我不打算使用这个免费的代码编写服务,我只需要一些帮助来理解正在发生的事情。

问题似乎更多是关于不可见文件及其对实际删除文件夹的权限。

这些是我从互联网上找到的各种脚本,但对文件夹没有影响

$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 + 删除项目-路径“C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy\ ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (AlbumArtSmall.jpg:FileInfo) [Remove-Item], IOException + FullyQualifiedErrorId : RemoveFileSystemItemUnAuthorizedAccess,Microsoft.PowerShell.Commands.RemoveItemCommand

下面的这一行将删除该文件夹,但是当我将-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 文件,但没有成功,我确实在 rmdir 之后添加了 /S 开关,但随后它尝试删除包含我想要保留的文件的文件夹。

@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"

希望这更清楚,我的问题是有道理的。如果有任何人可以向我指出可以帮助我解决此问题的资源,那将是向前迈出的一步。

【问题讨论】:

  • 你能澄清一下你需要什么帮助吗?您要删除所有没有内容的目录吗?还是要删除不包含任何内容和/或“不可见”内容的目录?如果是后者,我们如何确定究竟是什么构成了“隐形”内容?目前,尤其是您没有提供代码,而且这不是免费的代码编写服务,您的问题离题了。
  • 可能重复:stackoverflow.com/a/11005300/175063 我知道提到了 PowerShell,但你的标签中也有 Batch。
  • 您的问题不是很清楚您想要做什么,但是您对事件的描述建议您应该尝试以提升的权限运行您的脚本。你试过吗?
  • 道歉不够清楚。我想删除音乐目录中的所有空文件夹和子文件夹以清除它。问题是,如果我在 Windows 资源管理器中查看该文件夹,它显示为空(链接 1 中的图片),但似乎有 VS Code 可以看到的不可见文件(链接 2 中的图片)。我尝试以管理员身份运行 PowerShell,并将音乐文件夹的所有权更改为“所有人”,并赋予该用户完全控制权。在下一篇文章中继续。
  • 我确实尝试使用 #Remove-Item -Path "C:\Users\Lewis\Desktop\Extraction_Test\Music_Copy\Clinton Sparks\SXSW 2009 Showcasing Artists\" 作为实验,我得到了以下结果下一条评论中的错误

标签: powershell directory permissions


【解决方案1】:
$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"

【讨论】:

  • 感谢您的回复,但关于上面编辑问题中显示的权限,我遇到了与以前相同的错误。此外,该代码将包含 20 个 .mp3 文件的文件夹标记为空。 'remove-item -force -recurse' 工作正常,但与代码一起使用时不能识别空文件夹。
【解决方案2】:

感谢 cmets 和建议,我现在或多或少地工作了。主要问题是每个文件夹中隐藏的系统文件。一旦我更改了 Windows 资源管理器上的选项,我使用批处理文件删除这些,然后运行并删除空文件夹。希望这对将来的某人有所帮助。 这是我用来将我想要的文件移动到我想要的文件夹的 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

这是用于遍历和删除空目录和子目录的脚本。它需要运行几次以确保它捕获所有内容。这是上面在回复中提到的代码,最初由于隐藏的系统文件而无法正常工作。当目录中仍有文件时,它会将目录标记为空,但在正常运行时不会将其删除。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2015-12-25
    • 1970-01-01
    • 2017-02-19
    • 2019-08-16
    • 2021-12-06
    相关资源
    最近更新 更多