2017-12-18 20 views
0

특정 경로의 각 파일/폴더 크기를 가져 와서 파일에 출력하고 싶습니다.PowerShell, 사용자 지정 출력의 모든 파일과 폴더의 크기를 재귀 적으로 얻는 방법

내 제한된 PowerShell 지식으로 최대한 많은 PowerShell을 사용하고 많은 게시물을 살펴 봤지만 필요한만큼 출력 할 방법을 찾을 수없는 것 같습니다.

현재이 스크립트 덕분에 post 덕분입니다.

$folderToBeListed = "PATH"; 
$folder = (Get-ChildItem $folderToBeListed -recurse | Where-Object {$_.PSIsContainer -eq $False} | Sort-Object) 

foreach ($i in $folder) 
{ 
    $i.DirectoryName 
    $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property Length -sum | Select-Object Sum) 
    $i.Name + " -- " + "{0:N2}" -f ($subFolderItems.sum /1MB) + " MB" 

} 

<# 
$date = "$(Get-Date -f [email protected])h$(Get-Date -f mm)m$(Get-Date -f ss)s" 
Out-File PATH\filesSizes_$date.txt 
#> 

이 아래의 형식으로 출력 :이처럼되고 출력을 원하는

DirectoryName -- size MB 
FileName -- size MB 
DirectoryName 
FileName -- size MB 

을 :

DirectoryName -- size MB 
    FileName1 -- size MB 
    FileName2 -- size MB 
    Folder1 -- size MB 
     FileName3 -- size MB 
     FileName4 -- size MB 
    Folder2 -- size MB 
     FileName5 -- size MB 
DirectoryName2 -- size MB 
... 

재귀 적으로 모든 파일과 폴더를 갈 수있는 방법이 있나요 그런 식으로 서식을 지정하거나 파일을 통해 DirectoryName 출력 형식을 유지하고 디렉터리 이름으로 필터링해야합니까?

그럼 난 파일 (주석 부분은 아직 내가 아웃 - 파일 먹이를 모르는 나의 출발점이 될 것입니다 출력 결과를하고 싶습니다.

업데이트

들여 쓰기를 선택 사항입니다. 그것은이다 그래서, 아래의 출력 괜찮을 것보다 시각적으로 정말 출력으로 얻을 수 있지만하려는 것을 넣어.

DirectoryName -- size MB 
FileName1 -- size MB 
FileName2 -- size MB 
Folder1 -- size MB 
FileName3 -- size MB 
FileName4 -- size MB 
Folder2 -- size MB 
FileName5 -- size MB 
DirectoryName2 -- size MB 
... 

업데이트 2

현재 업데이트 된 내용입니다. 아직 결함이 있으며 아직 올바르지 않습니다. 이 코드 아래에있는 문제를 설명 할 것입니다.

$folderToBeListed = "PATH"; 
$elements = Get-ChildItem $folderToBeListed -recurse 
$originSize = getSizeFolder -path $folderToBeListed 
"Listed folder : " + $folderToBeListed + " -- Size : " + $originSize + " MB"| Out-String 

foreach ($i in $elements) 
{ 
    if($i.PSIsContainer -eq $True) 
    { 
     try 
     { 
      $folderSize = getSizeFolder -path $i.FullName 

      "`n`nFolder -- " + $i.Name + " -- Size : " + $folderSize + " MB" | Out-String 

      foreach ($it in (Get-ChildItem $i.FullName -recurse)) 
      { 
       $fileSize = getSizeFile -path $it.FullName 
       $it.Name + " -- " + $fileSize + " KB" 
      } 

     } 
     catch 
     { 
      "NOOO (It's a catch, line ~28)" | Out-String 
     } 
    } 
    else 
    { 
     $i.Name + " -- " + $fileSize + " KB" 
    }  
} 

function getSizeFolder($path) 
{ 
    $sizeFolder = (Get-Item $path).GetFiles() | Measure-Object -Sum Length 
    return $sizeFolder.Sum/1000000 <#Supposed MB#> 
} 

function getSizeFile($path) 
{ 
    $sizeFile = (Get-Item $path).Length 
    return $sizeFile/1000 <#Supposed KB#> 
} 

내가 만남을 가지고있는 상황 때문에 좋아 아직 다음과 같습니다 :

1 다른 폴더를 포함하는 폴더가 있다면, 그것은 단지 내부 목록을 모든 폴더와 파일을 수행합니다.

Folder -- DirectoryName -- Size XX MB 
Folder1 -- Size XX KB 
Folder2 -- Size XX KB 
FileInFolder1 -- Size XX KB 
... 

2 파일이 들어있는 폴더 만있는 경우 정상적으로 표시됩니다. 말했다되고 그건

Folder -- DirectoryName -- Size XX MB 
File1 -- Size XX KB 
File2 -- Size XX KB 
Folder2 -- DirectoryName -- Size XX MB 
File3 -- Size XX KB 
File4 -- Size XX KB 
... 

, 나는 여전히 때문에 다른 절의 끝 부분에 나열된 모든 파일 ...

업데이트를

3는 다른 접근 방식을 조금했다. 이것은 모든 폴더와 선택한 폴더의 파일을 나열하지만 아직 "재귀"를 구현하지 않았습니다. 아직도 알고리즘을 알아 내려고 노력하고 있습니다. 또한 txt 파일에서 쓰기 작업을 아직 시작하지 않았습니다. 모든 도움을 주시면 감사하겠습니다!

function getFoldersInFolder($path) 
{ 
    [array]$elements = Get-ChildItem $path | Where-Object {$_.PSIsContainer} 
    return $elements 
} 

function getFilesInFolder($path) 
{ 
    [array]$elements = Get-ChildItem $path | Where-Object {!$_.PSIsContainer} 
    return $elements 
} 

function getSizeFolder($path) 
{ 
    $sizeFolder = (Get-Item $path).GetFiles() | Measure-Object -Sum Length 

    if($sizeFolder.Sum -lt 1000)<#Octets#> 
    { 
     if($sizeFolder.Sum -eq $Null)<#The folder contains only folders#> 
     { 
      return "`n`nThe size is null (th efolder only contains folders.)`nThe sizes of each folder will be displayed below." 
     } 
     else 
     { 
      return "{0:N2}" -f $sizeFolder.Sum + " octets" 
     } 
    } 
    elseif($sizeFolder.Sum -gt 1000 -and $sizeFolder.Sum -lt 999999)<#Ko#> 
    { 
     return "{0:N2}" -f ($sizeFolder.Sum/1000) + " Ko" 
    } 
    elseif($sizeFolder.Sum -gt 1000000 -and $sizeFolder.Sum -lt 999999999)<#Mo#> 
    { 
     return "{0:N2}" -f ($sizeFolder.Sum/1000000) + " Mo" 
    } 
    elseif($sizeFolder.Sum -gt 1000000000 -and $sizeFolder.Sum -lt 999999999999)<#Go#> 
    { 
     return "{0:N2}" -f ($sizeFolder.Sum/1000000000) + " Go"  
    } 

} 

function getSizeFile($path) 
{ 
    $sizeFile = (Get-Item $path).Length 

    if($sizeFile -lt 1000)<#Octets#> 
    { 
     return "{0:N2}" -f $sizeFile + " octets" 
    } 
    elseif($sizeFile -gt 1000 -and $sizeFile -lt 999999)<#Ko#> 
    { 
     return "{0:N2}" -f ($sizeFile/1000) + " Ko" 
    } 
    elseif($sizeFile -gt 1000000 -and $sizeFile -lt 999999999)<#Mo#> 
    { 
     return "{0:N2}" -f ($sizeFile/1000000) + " Mo" 
    } 
    elseif($sizeFile -gt 1000000000 -and $sizeFile -lt 999999999999)<#Go#> 
    { 
     return "{0:N2}" -f ($sizeFile/1000000000) + " Go"  
    } 
} 

function main() 
{ 
    $folder = "{INPUT PATH HERE}" 

    $originFolderSize = getSizeFolder -path $folder 

    Write-Host "`nBelow are the files/folders from : $folder => Size : $originFolderSize `n"  

    <#List all folders#> 

    [array]$foldersInFolder = getFoldersInFolder -path $folder 

    for($i = 0; $i -lt $foldersInFolder.Count; $i++) 
    { 
     ##$foldersInFolder[$i] | Out-String 

     $tempPath = $folder + "\" + $foldersInFolder[$i] 

     $tempFolderSize = getSizeFolder -path $tempPath 

     Write-Host FOLDER => $foldersInFolder[$i] => Size : $tempFolderSize`n   
    } 

    <#List all files#> 
    [array]$filesInFolder = getFilesInFolder -path $folder 

    for($i = 0; $i -lt $filesInFolder.Count; $i++) 
    { 
     ##$filesInFolder[$i] | Out-String 

     $tempPath = $folder + "\" + $filesInFolder[$i] 

     $tempFileSize = getSizeFile -path $tempPath 

     Write-Host FILE => $filesInFolder[$i] => Size : $tempFileSize`n 
    } 

} 

main 

이이 같은 출력을 수행 여기

df 

dh 

이 물건의 크기를 얻기의 예는 다음과 같습니다

Below are the files/folders from : PATH => Size : XX,XX Mo 
FOLDER1 => Folder1Name => Size : XX,XX Mo 
FOLDER2 => Folder2Name => Size : XX,XX Ko 
FILE1 => File1Name => Size : XX,XX Mo 
FILE2 => File2Name => Size : XX,XX Go 
FILE3 => File3Name => Size : XX,XX Ko 
+0

'DirectoryName'과'Folder1'은 실제로 구별 할 수 없습니다. 당신은 여전히 ​​그 옆에있는 크기로 끝날 것입니다. 당신이하는 것처럼 자동으로 들여 쓰기를하는 동안 재귀 적으로 사용하는 것은 꽤 어려울 것입니다. – TheIncorrigible1

+0

들여 쓰기가 실제로 필자의 초점이 아니며, 위에있는'DirectoryName'을 얻은 형식에 관한 것입니다. 특정 디렉토리 등이 있습니다. – Marks

+0

형식을 따르는 한 들여 쓰기가 전혀 끝나지 않을 수 있습니다. 나는 과거에 이것을했습니다. 답을 쓸 시간이 없지만 재귀를 사용하고 들여 쓰기 수준을 재귀 함수로 전달하면 함수는 자신을 호출하기 전에 들여 쓰기를 증가시킵니다. – EBGreen

답변

-2

는이 두 가지 명령을 봐, 그들이 사용 될 수 있습니다 2 개의 디렉토리 및 인간 포맷 (512 바이트 블록이 아님)의 최대 깊이

> du -h --max-depth=2 
1.0K ./.docker 
1.0K ./.eclipse/org.eclipse.epp.logging.aeri 
2.0K ./.eclipse/org.eclipse.oomph.jreinfo 
2.6M ./.eclipse/org.eclipse.oomph.p2 
578K ./.eclipse/org.eclipse.oomph.setup 
1.0K ./.eclipse/org.eclipse.oomph.setup.installer 
3.2M ./.eclipse 
209M ./.m2/repository 
209M ./.m2 
0  ./.matplotlib 
0  ./.nbi/downloads 
5.0M ./.nbi/log 
364K ./.nbi/product-cache 
317K ./.nbi/tmp 
0  ./.nbi/wd 
5.8M ./.nbi 
109K ./.p2/org.eclipse.equinox.p2.core 
467K ./.p2/org.eclipse.equinox.p2.engine 
2.5M ./.p2/org.eclipse.equinox.p2.repository 
203M ./.p2/pool 
206M ./.p2 
6.0K ./.ssh 
68K  ./.tooling/gradle 
68K  ./.tooling 

이것은 내 Win10 PowerShell에서 효과가있었습니다. 귀하의 성공은 다를 수 있습니다.

+0

이 명령을 살펴 보겠습니다. – Marks

+1

나는 당신이 * nix utils가 설치된 Windows의 포트가 있다고 생각한다. – EBGreen

+0

@EBGreen 내가 할 수있는 일이지만 도움/사람을 확인하고 그것이 WinCore의 일부였던 것처럼 보였다 ... 나는 Win10에 대한 꿈을 꾸었다 고 생각한다. 미안하지만 또 다른 비트는 아니야 ... 나쁘다. 나는 Cygwin (구식 일 가능성이 높다)을 어딘가에 가지고 있다고 생각한다 ... – DDeMartini