(chỉnh sửa)
tôi đã tìm ra cách để tự động thêm một tài sản (gọi là "kịch bản tài sản") đến Fileobject, vì vậy bây giờ, tôi có thể sử dụng cú pháp: $ theFileObject.CompressedSize để đọc kích thước.
(kết thúc chỉnh sửa)
phản ứng của đọc Goyuix, và tôi nghĩ "Cool, nhưng không phải là có một số loại khả năng kiểu mở rộng trong Powershell?". Vì vậy, sau đó tôi tìm thấy bài đăng này Scott Hanselman: http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx
Và tôi đã tạo Thuộc tính tập lệnh cho đối tượng FileInfo: CompressedSize.
Dưới đây là những gì tôi đã làm: (lưu ý: Tôi là khá mới để Powershell, hoặc ít nhất là tôi không sử dụng nó nhiều này có thể có thể được thực hiện tốt hơn rất nhiều, nhưng đây là những gì tôi đã làm:.
Trước tiên, tôi biên soạn Ntfs.ExtendedFileInfo từ bài Goyuix của. tôi đặt DLL trong thư mục hồ sơ Powershell của tôi (Documents \ WindowsPowershell)
Tiếp theo, tôi đã tạo ra một tập tin trong thư mục hồ sơ của tôi tên là My.Types.ps1xml.
Tôi đặt XML sau vào tệp:
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>CompressedSize</Name>
<GetScriptBlock>
[Ntfs.ExtendedFileInfo]::GetCompressedFileSize($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Mã đó (khi được hợp nhất vào hệ thống kiểu) sẽ tự động thêm thuộc tính có tên là CompressedSize vào đối tượng FileInfo được trả về bởi get-childitem/dir.Nhưng Powershell không biết về mã, và nó không biết về DLL của tôi được nêu ra. Chúng tôi xử lý điều đó trong bước tiếp theo:
Chỉnh sửa tiểu sử.ps1. trong cùng một thư mục. Bây giờ, hồ sơ của tôi xảy ra đã có một số nội dung trong đó vì tôi đã cài đặt Tiện ích mở rộng cộng đồng cho quyền năng. Hy vọng rằng, tôi sẽ bao gồm mọi thứ bạn cần trong đoạn mã tiếp theo này, vì vậy nó sẽ hoạt động ngay cả trên một máy không có phần mở rộng. Thêm mã sau vào Profile.ps1:
#This will load the ExtendedfileInfo assembly to enable the GetCompressedFileSize method. this method is used by the
#PSCompressedSize Script Property attached to the FileInfo object.
$null = [System.Reflection.Assembly]::LoadFile("$ProfileDir\ntfs.extendedfileinfo.dll")
#merge in my extended types
$profileTypes = $ProfileDir | join-path -childpath "My.Types.ps1xml"
Update-TypeData $profileTypes
Bây giờ, biến $ ProfileDir mà tôi tham chiếu được xác định trước đó trong tập lệnh Profile.ps1 của tôi. Chỉ trong trường hợp nó không phải là của bạn, đây là định nghĩa:
$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent
Vậy đó. Lần sau khi bạn chạy Powershell, bạn có thể truy cập thuộc tính CompressedSize trên đối tượng FileInfo giống như thể nó là bất kỳ thuộc tính nào khác. Ví dụ:
$ myfile = dir c: \ temp \ myfile.txt
$ myFile.CompressedSize
này hoạt động (trên máy tính của tôi, dù sao), nhưng tôi rất thích nghe dù nó phù hợp với các phương pháp hay nhất. Một điều tôi biết tôi đang làm sai: trong file Profile.ps1, tôi trả về kết quả của LoadFile thành một biến mà tôi sẽ không sử dụng ($ null = blah blah). Tôi đã làm điều đó để ngăn chặn hiển thị kết quả của tập tin tải vào bàn điều khiển. Có lẽ là một cách tốt hơn để làm điều đó.
Bạn có muốn bao gồm các không gian trên đĩa lãng phí do không gian cụm không sử dụng? (điều này là khó khăn với các tệp nhỏ do nội tuyến trong MFT) hoặc chỉ là khía cạnh nén đủ – ShuggyCoUk