Powershell命令删除子文件夹而不删除根

Cra*_*w89 4 directory powershell root

我在创建PS命令时遇到问题,该命令允许我删除多个子文件夹而不删除屋顶文件夹.

IE:

C:\ Test有很多子文件夹:

  • C:\测试\项目1
  • C:\测试\项目2
  • C:\测试\项目3

文件夹Item1,Item2和Item3有很多子文件夹和文件.

我想创建一个PS,允许我删除Item1,Item2和Item3中的所有空子文件夹而不删除Item1,Item2和Item3文件夹.任何Item文件夹都可能为空,但我不想删除它们,只是每个文件夹的空内容.

这只是一个例子,我在Test中有大约300个Item文件夹.

我通常会用这个:

$ PATH = "C:\ TEST"

 do {

       $dir = gci $path -directory -recurse | Where { (gci $_.fullName).count -eq 0 } | select -expandproperty FullName

       $dir | Foreach-Object { Remove-Item $_ }

    } while ($dir.count -gt 0)
Run Code Online (Sandbox Code Playgroud)

但是如果它们为空,则删除文件夹根文件夹(Item1,Item2或Item3).

提前致谢.

Fab*_*lde 16

那么您是要删除空子文件夹中的所有项目还是常规中的所有项目?

这将删除目录"C:\ abc \"内的所有文件夹或项目.

$path = "C:\abc\"
Get-ChildItem -Path $path -Recurse| Foreach-object {Remove-item -Recurse -path $_.FullName }
Run Code Online (Sandbox Code Playgroud)

这将删除所有没有任何项目的文件夹.

$path = "C:\abc\"
Get-ChildItem -Path $path -Recurse | Where-Object {(Get-ChildItem $_.FullName).Count -eq 0} |Foreach-object {Remove-item -Recurse -path $_.FullName }
Run Code Online (Sandbox Code Playgroud)

'这将查看内部"C:\ abc \"获取所有子项并删除示例中子项内的所有空目录,这将是Item1,Item2,...

$Path = "C:\abc\"
$itemFolders= Get-ChildItem -Path $Path
$itemFolders| Foreach-Object {
    Get-ChildItem -Path $_.FullName |
    Where-Object {(Get-ChildItem $_.FullName).Count -eq 0} | 
    Foreach-object {Remove-item -Recurse -path $_.FullName }
}
Run Code Online (Sandbox Code Playgroud)

只是快速而肮脏的Code,因为我没有太多时间,希望我可以帮忙.

编辑:这是我提出的,它不是我想要的高效,但它完成工作,并且相当快,自己尝试它对我有用 - 甚至扔了几个评论和输出到澄清发生了什么.

$Path="C:\abc\"
$itemFolders = Get-ChildItem $Path
#Get All Folders inside
$AllFolders = $itemFolders | Get-ChildItem -Recurse | Where-Object {$_.PSIsContainer} | Select -Property FullName
#First delete all files older than 30 days
$itemFolders | Get-ChildItem -Recurse -File | ForEach-Object{
    $limit = (Get-Date).AddDays(-30)
    if($_.LastWriteTime -lt $limit)
    {
        "{0} hasn't been modified in the last 30 days deleting it" -f $_.FullName
        Remove-Item -Path $_.FullName -Force -ErrorAction SilentlyContinue        
    }
}
#Check if there are files inside that are not containers
$AllFolders | ForEach-Object{
    $files = Get-ChildItem -File -Recurse -Path $_.FullName
    $directories = Get-ChildItem -Directory -Recurse -Path $_.FullName

    #If There are any files inside the folder dont delete it.
    if($files.Count -gt 0)
    {
        "Found {0} files inside {1} do not delete this" -f $files.Count, $_.FullName
    }
    #If There are no files and no directories inside delete it.
    elseif($files.Count -eq 0 -and $directories.Count -eq 0)
    {
        "Empty Folder {0} deleting it" -f $_.FullName
        Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue
    }
    #If there are no files and empty directories inside delete it.
    elseif($files.Count -eq 0 -and $directories.Count -gt 0)
    {
        "No Files but directories found in {0} since its recursive delete it" -f $_.FullName
        Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue        
    }
}
Run Code Online (Sandbox Code Playgroud)