2009-04-30 27 views

Trả lời

21

Hãy thử như sau

function Get-DirectorySize() { 
    param ([string]$root = $(resolve-path .)) 
    gci -re $root | 
    ?{ -not $_.PSIsContainer } | 
    measure-object -sum -property Length 
} 

Điều này thực sự tạo ra một chút của một đối tượng tóm tắt mà sẽ bao gồm các Tính của các mặt hàng. Bạn chỉ có thể lấy tài sản Sum dù và điều đó sẽ là tổng độ dài

$sum = (Get-DirectorySize "Some\File\Path").Sum 

EDIT Tại sao công việc này?

Hãy chia nhỏ các thành phần của đường ống. Lệnh gci -re $root sẽ nhận tất cả các mục từ thư mục bắt đầu $root đệ quy và sau đó đẩy chúng vào đường ống. Vì vậy, mỗi tệp và thư mục dưới $root sẽ chuyển qua biểu thức thứ hai ?{ -not $_.PSIsContainer }. Mỗi tệp/thư mục khi được chuyển đến biểu thức này có thể được truy cập thông qua biến số $_. Trước đó ? cho biết đây là biểu thức lọc có nghĩa là chỉ giữ giá trị trong đường ống đáp ứng điều kiện này. Phương thức PSIsContainer sẽ trả về true cho các thư mục. Vì vậy, có hiệu lực biểu thức lọc chỉ giữ các giá trị tệp. Đối tượng đo lường cmdlet cuối cùng sẽ tổng giá trị của thuộc tính Length trên tất cả các giá trị còn lại trong đường ống. Vì vậy, nó chủ yếu gọi Fileinfo.Length cho tất cả các tập tin theo thư mục hiện hành (đệ quy) và tổng hợp các giá trị.

+5

Tốt. (Get-DirectorySize "Một số \ File \ Path") Sum/1mb hoặc (Get-DirectorySize "Một số \ File \ Path") Sum/1gb để chuyển đổi sang megs hoặc biểu diễn. – aphoria

+0

Bạn có thể giải thích cách hoạt động không? –

+0

@Gauenwolf, đã thêm bản chỉnh sửa để giải thích – JaredPar

2

Nếu bạn quan tâm đến việc bao gồm kích thước tệp ẩn và hệ thống thì bạn nên sử dụng tham số-force với Get-ChildItem.

2

Dưới đây là cách nhanh chóng để có được kích thước của phần mở rộng tập tin cụ thể:

(gci d:\folder1 -r -force -include *.txt,*.csv | measure -sum -property Length).Sum 
1

Nhờ có những người được đăng ở đây. Tôi đã sử dụng kiến ​​thức để tạo điều này:

# Loops through each directory recursively in the current directory and lists its size. 
# Children nodes of parents are tabbed 

function getSizeOfFolders($Parent, $TabIndex) { 
    $Folders = (Get-ChildItem $Parent);  # Get the nodes in the current directory 
    ForEach($Folder in $Folders)   # For each of the nodes found above 
    { 
     # If the node is a directory 
     if ($folder.getType().name -eq "DirectoryInfo") 
     { 
      # Gets the size of the folder 
      $FolderSize = Get-ChildItem "$Parent\$Folder" -Recurse | Measure-Object -property length -sum -ErrorAction SilentlyContinue; 
      # The amount of tabbing at the start of a string 
      $Tab = " " * $TabIndex; 
      # String to write to stdout 
      $Tab + " " + $Folder.Name + " " + ("{0:N2}" -f ($FolderSize.Sum/1mb)); 
      # Check that this node doesn't have children (Call this function recursively) 
      getSizeOfFolders $Folder.FullName ($TabIndex + 1); 
     } 
    } 
} 

# First call of the function (starts in the current directory) 
getSizeOfFolders "." 0 
Các vấn đề liên quan