programing

하위 디렉터리를 나열하지 않고 폴더의 전원 차단 폴더 크기

sourcejob 2023. 8. 22. 22:07
반응형

하위 디렉터리를 나열하지 않고 폴더의 전원 차단 폴더 크기

다음 스크립트를 사용하여 폴더 크기를 가져오는 여러 리소스를 찾았습니다.

$colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object)
foreach ($i in $colItems)
    {
        $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum)
        $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
    }

문제는 하위 디렉터리도 나열된다는 것입니다.

c:\test\1 -- 10mb
c:\test\1\folder -- 10mb
c:\test\1\folder\deep -- 5mb
c:\test\1\folder\tuna -- 5mb
c:\test\2 -- 20bm
c:\test\2\folder -- 20mb
c:\test\2\folder\deep -- 10mb
c:\test\2\folder\tuna -- 10mb

제가 어디로 가는지 아시리라 생각합니다.제가 찾고 있는 것은 부모 폴더의 결과입니다...

c:\test\1 -- 10mb
c:\test\2 -- 20mb

파워셸로 어떻게 이 일을 해낼 수 있을까요?

각 디렉토리의 총 내용 크기를 재귀적으로 가져와야 출력할 수 있습니다.발생할 (▁directories▁also▁(▁doas▁a▁youies)Length매개 변수).

원하는 출력에 맞게 수정된 스크립트는 다음과 같습니다.

$colItems = Get-ChildItem $startFolder | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
foreach ($i in $colItems)
{
    $subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
    $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"
}

이 간단한 해결책은 저에게도 효과가 있었습니다.

Get-ChildItem -Recurse 'directory_path' | Measure-Object -Property Length -Sum

@한 솔루션: @Linga 게시솔루:"Get-ChildItem -Recurse 'directory_path' | Measure-Object -Property Length -Sum"착하고 짧습니다.은 오직 그나러, 은것단크계산의 합니다.'directory_path'하위 디렉터리가 없습니다.
다음은 모든 하위 디렉터리 크기를 나열하는 간단한 솔루션입니다.예쁜 프린트가 조금 더 추가되었습니다.
(으)로 :-File비어 있는 하위 디렉터리에 대한 오류를 방지하는 옵션)

foreach ($d in gci -Directory -Force) {
  '{0,15:N0}' -f ((gci $d -File -Recurse -Force | measure length -sum).sum) + "`t`t$d" 
}

죽은 실타래를 재현해서 미안하지만, 저는 이것을 제 스스로 해결해왔고, 온갖 터무니없이 비대해진 해결책을 찾은 후에, 저는 이것을 겨우 생각해냈습니다.

[Long]$actualSize = 0
foreach ($item in (Get-ChildItem $path -recurse | Where {-not $_.PSIsContainer} | ForEach-Object {$_.FullName})) {
   $actualSize += (Get-Item $item).length
}

합니다. ▁want▁▁units▁size▁▁be다▁can▁converted▁any▁easily▁to▁gives있니,몇▁in▁and▁me▁a▁folder로 쉽게 변환할 수 있습니다./ 1MB뭐 그런 것들내가 뭘 빼놓았나요?이 과도한 혼란에 비해 그것은 다소 단순하고 요점이 있는 것처럼 보입니다.호출된 함수가 정의된 함수와 동일한 이름이 아니기 때문에 코드가 작동하지 않는 것은 말할 것도 없습니다.그리고 6년 동안 틀렸습니다.;) 그렇다면, 이 제거된 접근법을 사용하지 않을 이유가 있습니까?

이것은 https://stackoverflow.com/users/3396598/kohlbrr 답변과 유사하지만 단일 폴더의 전체 크기를 가져오려고 시도한 결과 스크립트가 검색 중인 폴더의 루트에 있는 파일을 계산하지 않습니다.이것은 저에게 효과가 있었습니다.

$startFolder = "C:\Users";
$totalSize = 0;

$colItems = Get-ChildItem $startFolder
foreach ($i in $colItems)
{
    $subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
    $totalSize = $totalSize + $subFolderItems.sum / 1MB

}

$startFolder + " | " + "{0:N2}" -f ($totalSize) + " MB"

이것은 제가 몇 번이고 반복해서 찾게 되는 것입니다. 제가 제 자신에게 멋진 기능을 썼음에도 불구하고 말이죠.그래서, 저는 다른 사람들이 그것을 가지면 이득을 볼 것이라고 생각했고, 어쩌면 저는 그것을 여기서 찾을 수도 있을 것입니다.하하하.

스크립트에 붙여넣고 사용하는 것은 매우 간단합니다.폴더 개체를 전달합니다.

Get-ChildItem 명령의 -directory 플래그 때문에 PowerShell 3이 필요하다고 생각하지만, 필요하다면 쉽게 적응할 수 있다고 확신합니다.

function Get-TreeSize ($folder = $null)
{
    #Function to get recursive folder size
    $result = @()
    $folderResult = "" | Select-Object FolderPath, FolderName, SizeKB, SizeMB, SizeGB, OverThreshold

    $contents  = Get-ChildItem $folder.FullName -recurse -force -erroraction SilentlyContinue -Include * | Where-Object {$_.psiscontainer -eq $false} | Measure-Object -Property length -sum | Select-Object sum
    $sizeKB = [math]::Round($contents.sum / 1000,3)   #.ToString("#.##")
    $sizeMB = [math]::Round($contents.sum / 1000000,3)   #.ToString("#.##")
    $sizeGB = [math]::Round($contents.sum / 1000000000,3)   #.ToString("#.###")

    $folderResult.FolderPath = $folder.FullName
    $folderResult.FolderName = $folder.BaseName
    $folderResult.SizeKB = $sizeKB
    $folderresult.SizeMB = $sizeMB
    $folderresult.SizeGB = $sizeGB
    $result += $folderResult

    return $result
} 


#Use the function like this for a single directory
$topDir = get-item "C:\test"
Get-TreeSize ($topDir)

#Use the function like this for all top level folders within a direcotry
#$topDir = gci -directory "\\server\share\folder"
$topDir = Get-ChildItem -directory "C:\test"
foreach ($folderPath in $topDir) {Get-TreeSize $folderPath}  

내 제안:

$dir="C:\temp\"
get-childitem $dir -file -Rec | group Directory | where Name -eq $dir | select Name, @{N='Size';E={(($_.Group.Length | measure -Sum).Sum / 1MB)}}

du.exe 또는 du64.exe -l 1. 또는 2단계 다운된 sysinternals.com 에서: **du -l 2 c:**

하지만 리눅스보다 훨씬 짧습니다 ;)

의 대답에.@squicc네가 만약amend다음 줄:$topDir = Get-ChildItem -directory "C:\test" with -force그러면 숨겨진 디렉터리도 볼 수 있습니다.이 옵션을 사용하지 않으면 폴더 내부 또는 외부에서 솔루션을 실행할 때 크기가 달라집니다.

저는 @kohlbrr의 훌륭한 답변을 사용했고 그것을 조금 개선했습니다.저는 또한 그것을 당신이 당신의 컴퓨터에 넣을 수 있는 기능으로 만들었습니다.$PROFILE이렇게 하면 텍스트 대신 세 가지 속성이 출력됩니다.Name,Size(MB로 변환된 크기의 문자열 출력),Value사용할 수 있는 원시 크기 값입니다.| sort value

function Get-DirectorySize([string] $rootFolder) {
  $colItems = Get-ChildItem $rootFolder | Where-Object {$_.PSIsContainer -eq $true} | Sort-Object
  
  foreach ($i in $colItems) {
    $subFolderItems = Get-ChildItem $i.FullName -recurse -force | Where-Object {$_.PSIsContainer -eq $false} | Measure-Object -property Length -sum | Select-Object Sum
    [PSCustomObject]@{ Name=$i.Fullname; Size="{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB"; Value=$subFolderItems.sum }
  }
}

다음 스크립트는 디렉터리의 파일 크기(깊지 않음)와 바이트 크기를 제공합니다. (두 스크립트 모두에서 경로를 $($args[0] 단위로 제공)

Get-ChildItem -Path "$($args[0])" -Recurse -Depth 0 -file| select Length,LastWriteTime,FullName | Export-Csv .\FileAndFolderSizes.csv -NoTypeInformation

다음 스크립트는 지정된 디렉토리 내의 폴더 크기(깊이 0)를 바이트 단위로 제공합니다.

$array= @()
Get-ChildItem -Path "$($args[0])" -Recurse -Depth 0 | Where-Object { $_.PSIsContainer } |
ForEach-Object {
$obj = New-Object PSObject

$Size = [Math]::Round((Get-ChildItem -Recurse $_.FullName | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum, 2)
$obj |Add-Member -MemberType NoteProperty -Name "FullName" $_.FullName
$obj |Add-Member -MemberType NoteProperty -Name "LastWriteTime" $_.LastWriteTime
$obj |Add-Member -MemberType NoteProperty -Name "Length" $Size
$array +=$obj
}
$array | select Length,LastWriteTime,FullName | Export-Csv .\FileAndFolderSizes.csv -NoTypeInformation -Append

출력은 다음과 같습니다.

"Length","LastWriteTime","FullName"
"593408","2/17/2022 10:51:01 PM","C:\a_appli\Partners_Ref\Client64_Rws2\compresslayer.dll"
"286720","2/9/2021 11:52:18 PM","C:\a_appli\Partners_Ref\Client64_Rws2\fdsrtd.dll"
"589312","6/19/2019 10:18:41 PM","C:\a_appli\Partners_Ref\Client64_Rws2\FdswCli.dll"
"13658276","3/18/2022 9:52:16 AM","C:\a_appli\Partners_Ref\Client64_Rws2\PartnersTemplateBuilder"

흥미롭게도, Nix 학습 PS에서 온 PS가 동시에 얼마나 강력하면서도 무력할 수 있는지. crgwin/gitbash를 설치한 후 다음 명령 하나로 어떤 조합도 수행할 수 있습니다.

현재 폴더의 크기: du -sk.

현재 디렉터리 du -sk 아래에 있는 모든 파일 및 폴더의 크기

모든 하위 폴더(현재 폴더 포함)의 크기가 ./ -type d -exec du -sk {} \;

언급URL : https://stackoverflow.com/questions/26494744/powershell-folder-size-of-folders-without-listing-subdirectories

반응형