(редактировать)
Я выяснил, как динамически добавлять свойство (называемое «свойством сценария») в Fileobject, поэтому теперь я могу использовать синтаксис: $ theFileObject.CompressedSize для чтения размера.
(конец редактирования)
Прочитайте ответ Goyuix, и я подумал: "Круто, но разве в Powershell нет какой-то возможности расширения типа?" И тогда я нашел этот пост Скотта Хансельмана: http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx
И я создал свойство Script для объекта FileInfo: CompressedSize.
Вот что я сделал: (примечание: я совершенно новичок в Powershell, или, по крайней мере, я не очень часто его использую. Возможно, это можно сделать намного лучше, но вот что я сделал:
Сначала я скомпилировал Ntfs.ExtendedFileInfo из поста Goyuix. Я поместил DLL в директорию своего профиля Powershell (Documents \ WindowsPowershell)
Затем я создал файл в каталоге моего профиля с именем My.Types.ps1xml.
Я поместил в файл следующий XML:
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>CompressedSize</Name>
<GetScriptBlock>
[Ntfs.ExtendedFileInfo]::GetCompressedFileSize($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Этот код (после слияния с системой типов) будет динамически добавлять свойство с именем CompressedSize к объектам FileInfo, которые возвращаются get-childitem / dir. Но Powershell еще не знает о коде и еще не знает о моей DLL. Мы справимся с этим на следующем шаге:
Редактировать Profile.ps1. в том же каталоге. Теперь мой файл профиля уже содержит некоторые вещи, потому что у меня установлены расширения сообщества для powershell. Надеюсь, я включу все, что вам нужно, в следующий фрагмент кода, чтобы он работал даже на машине, у которой нет расширений. Добавьте следующий код в 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
Теперь переменная $ ProfileDir, на которую я ссылаюсь, определена ранее в моем скрипте Profile.ps1. На всякий случай, если это не в вашем, вот определение:
$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent
Вот и все. В следующий раз, когда вы запустите Powershell, вы можете получить доступ к свойству CompressedSize объекта FileInfo, как если бы это было любое другое свойство.
Пример:
$ myFile = dir c: \ temp \ myfile.txt
$ myFile.CompressedSize
Это работает (на моей машине, во всяком случае), но я хотел бы услышать, соответствует ли это лучшим практикам. Одна вещь, которую я знаю, я делаю неправильно: в файле Profile.ps1 я возвращаю результаты LoadFile в переменную, которую я не собираюсь использовать ($ null = blah blah). Я сделал это, чтобы подавить отображение результата загрузки файла на консоль. Вероятно, есть лучший способ сделать это.