2017-12-18 29 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ファイルが含まれているフォルダのみがある場合は、正常に表示されます。言われて、私はまだので、else節の最後に記載されているすべてのファイルを持っていることを

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 

これは、このような出力ん:

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つのコマンドを見上げて、彼らが使用で次のようになります。ここでは

df 

dh 

はで物事のサイズを取得する例です。 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について夢を見ていたと思いますM $のCrapwareの別のビットではない...私の悪い。私はCygwin(時代遅れの可能性が最も高い)をどこかに持っていると思います... – DDeMartini

関連する問題