سؤال

وكيف يمكنني الحصول على دو تحليل -ish باستخدام بوويرشيل؟ أود أن تحقق بشكل دوري حجم الدلائل على القرص بلدي.

وفيما يلي يعطيني حجم كل ملف في الدليل الحالي:

foreach ($o in gci)
{
   Write-output $o.Length
}

ولكن ما أريد حقا هو حجم الكلي لجميع الملفات في الدليل، بما في ذلك الدلائل. كما أود أن تكون قادرة على ترتيب هذا الامر حسب الحجم، اختياريا.

هل كانت مفيدة؟

المحلول

وهناك تطبيق متوفر في "استكشاف جميلة اللغات" بلوق:

"تنفيذا ل" دو -s * في بوويرشيل "

function directory-summary($dir=".") { 
  get-childitem $dir | 
    % { $f = $_ ; 
        get-childitem -r $_.FullName | 
           measure-object -property length -sum | 
             select @{Name="Name";Expression={$f}},Sum}
}

(قانون من قبل المالك بلوق: لويس دييغو فاياس)

وإخراج:

PS C:\Python25> directory-summary

Name                  Sum
----                  ---
DLLs              4794012
Doc               4160038
include            382592
Lib              13752327
libs               948600
tcl               3248808
Tools              547784
LICENSE.txt         13817
NEWS.txt            88573
python.exe          24064
pythonw.exe         24576
README.txt          56691
w9xpopen.exe         4608

نصائح أخرى

ولقد عدلت الأمر في الإجابة قليلا لفرز تنازلي حسب الحجم وتشمل الحجم في MB:

gci . | 
  %{$f=$_; gci -r $_.FullName | 
    measure-object -property length -sum |
    select  @{Name="Name"; Expression={$f}}, 
            @{Name="Sum (MB)"; 
            Expression={"{0:N3}" -f ($_.sum / 1MB) }}, Sum } |
  sort Sum -desc |
  format-table -Property Name,"Sum (MB)", Sum -autosize

وإخراج:

PS C:\scripts> du

Name                                 Sum (MB)       Sum
----                                 --------       ---
results                              101.297  106217913
SysinternalsSuite                    56.081    58805079
ALUC                                 25.473    26710018
dir                                  11.812    12385690
dir2                                 3.168      3322298

وربما أنها ليست الطريقة الأكثر كفاءة، لكنه يعمل.

function Get-DiskUsage ([string]$path=".") {
    $groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } }
    foreach ($dn in $groupedList) {
        New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum }
    }
}

والألغام هي مختلفة بعض الشيء. المجموعة الأولى كل من الملفات على directoryname، ثم المشي من خلال أن المجاميع بناء قائمة لكل دليل (لتشمل الدلائل).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top