特定のパスの各ファイル/フォルダのサイズを取得してファイルに出力したいと考えています。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
'DirectoryName'と' Folder1'は本当に区別できません。あなたはまだそれの隣のサイズで終わるでしょう。あなたがやっているように自動インデントされている間に再帰的になるのはかなり難しいでしょう。 – TheIncorrigible1
インデントは実際には私の焦点ではありません。フォーマットの詳細は、上の 'DirectoryName'を取得し、特定のディレクトリなどがあります。それはフォーマットに従う限り、まったくインデントされなくなる可能性があります。 – Marks
私はこれを過去に行っています。私は答えを書く時間がありませんが、私は再帰を使用し、インデントレベルを再帰関数に渡した後、関数はそれ自身を呼び出す前にインデントをインクリメントします。 – EBGreen