특정 경로의 각 파일/폴더 크기를 가져 와서 파일에 출력하고 싶습니다.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
'DirectoryName'과'Folder1'은 실제로 구별 할 수 없습니다. 당신은 여전히 그 옆에있는 크기로 끝날 것입니다. 당신이하는 것처럼 자동으로 들여 쓰기를하는 동안 재귀 적으로 사용하는 것은 꽤 어려울 것입니다. – TheIncorrigible1
들여 쓰기가 실제로 필자의 초점이 아니며, 위에있는'DirectoryName'을 얻은 형식에 관한 것입니다. 특정 디렉토리 등이 있습니다. – Marks
형식을 따르는 한 들여 쓰기가 전혀 끝나지 않을 수 있습니다. 나는 과거에 이것을했습니다. 답을 쓸 시간이 없지만 재귀를 사용하고 들여 쓰기 수준을 재귀 함수로 전달하면 함수는 자신을 호출하기 전에 들여 쓰기를 증가시킵니다. – EBGreen