web-dev-qa-db-ja.com

ルートを削除せずにサブフォルダーを削除するPowerShellコマンド

ルーフフォルダーを削除せずに複数のサブフォルダーを削除できるPSコマンドを作成するのに問題があります。

I.E:

C:\ Testには多くのサブフォルダーがあります。

  • C:\ Test\Item1
  • C:\ Test\Item2
  • C:\ Test\Item3

また、フォルダーItem1、Item2、Item3には、多くのサブフォルダーとファイルがあります。

Item1、Item2、およびItem3フォルダーを削除せずに、Item1、Item2、およびItem3内のすべての空のサブフォルダーを削除できるPSを作成したいと考えています。アイテムフォルダーのいずれかが空である可能性がありますが、削除したくありません。各フォルダーの空のコンテンツのみです。

これは単なる例であり、Test内に約300のアイテムフォルダーがあります。

私は通常これを使用します:

$ 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)

ただし、空の場合は、フォルダーのルートフォルダー(Item1、Item2、またはItem3)が削除されます。

前もって感謝します。

5
CrazyCow89

空のサブフォルダ内のすべてのアイテムまたは一般的なすべてのアイテムを削除しようとしていますか?

これにより、ディレクトリ「C:\ abc \」内のすべてのフォルダまたはアイテムが削除されます

$path = "C:\abc\"
Get-ChildItem -Path $path -Recurse| Foreach-object {Remove-item -Recurse -path $_.FullName }

これにより、アイテムが含まれていないすべてのフォルダが削除されます。

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

´これは「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 }
}

時間がないので、コードの素朴で汚い部分だけです。お役に立てれば幸いです。

編集:ここに私が思いついたものがあります、それは私が望むほどの性能ではありませんが、それは仕事を成し遂げ、かなり迅速です、それが私のために働いた自分で試してください-いくつかのコメントを投げて、何が起こっているのかを明確にします。

$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        
    }
}
16
Fabian Fulde