(editar)
me di cuenta de cómo agregar dinámicamente una propiedad (llamada "propiedad de script") a la FileObject, por lo que ahora, puedo usar la sintaxis: $ theFileObject.CompressedSize para leer el tamaño.
(final de la edición)
respuesta de Lee Goyuix, y pensé "Cool, pero no está allí algún tipo de capacidad de tipo de extensión en Powershell?". Entonces encontré esta publicación de Scott Hanselman: http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx
Y creé una propiedad de script para el objeto FileInfo: CompressedSize.
Aquí es lo que hice: (nota: Soy bastante nuevo en Powershell, o al menos yo no lo uso mucho Esto probablemente se podría hacer mucho mejor, pero esto es lo que hice:.
en primer lugar, he recopilado la Ntfs.ExtendedFileInfo desde el puesto de Goyuix. pongo la DLL en mi directorio del perfil Powershell (documentos \ WindowsPowerShell)
a continuación, he creado un archivo en mi directorio de perfil denominado My.Types.ps1xml.
Puse el siguiente XML en el archivo:
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>CompressedSize</Name>
<GetScriptBlock>
[Ntfs.ExtendedFileInfo]::GetCompressedFileSize($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Ese código (una vez fusionado en el sistema de tipos) agregará dinámicamente una propiedad denominada CompressedSize a los objetos FileInfo que devuelve get-childitem/dir.Pero Powershell aún no conoce el código, y aún no sabe sobre mi DLL. Nos ocupamos de eso en el próximo paso:
Editar Profile.ps1. en el mismo directorio. Ahora, mi archivo de perfil ya tiene algunas cosas porque tengo las extensiones de comunidad para powershell instaladas. Afortunadamente, incluyo todo lo que necesita en este próximo fragmento de código, para que funcione incluso en una máquina que no tenga las extensiones. Agregue el código siguiente para 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
Ahora, la variable $ ProfileDir que referencia se define anteriormente en mi guión Profile.ps1. En caso de que no esté en el tuyo, aquí está la definición:
$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent
Eso es todo. La próxima vez que ejecute Powershell, puede acceder a la propiedad ComprimirTamaño en el objeto FileInfo como si se tratara de otra propiedad. Ejemplo:
$ myFile = dir c: \ temp miarchivo.txt \
$ myFile.CompressedSize
Esto funciona (en mi máquina, de todos modos), pero me encantaría saber si se ajusta con las mejores prácticas. Una cosa que sé que estoy haciendo mal: en el archivo Profile.ps1, devuelvo los resultados de LoadFile a una variable que no voy a usar ($ null = blah blah). Lo hice para suprimir la visualización del resultado del archivo de carga en la consola. Probablemente haya una mejor manera de hacerlo.
¿Quieres incluir el espacio en disco desperdiciado por el espacio no utilizado del clúster? (Esto es complicado con archivos pequeños debido a la inclusión en el MFT) o solo es el aspecto comprimido suficiente – ShuggyCoUk