(modifier)
je me suis dit comment ajouter dynamiquement une propriété (appelée « propriété de script ») à la FileObject, maintenant, je peux utiliser la syntaxe: theFileObject.CompressedSize $ pour lire la taille.
(fin modifier)
de réponse de Lire Goyuix, et je pensais que « Cool, mais il est pas là une sorte de capacité de type extension Powershell? ». Alors j'ai trouvé ce message Scott Hanselman: http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx
Et j'ai créé une propriété de script pour l'objet FileInfo: CompressedSize.
Voici ce que je l'ai fait: (note: Je suis tout à fait nouveau pour Powershell, ou du moins je ne l'utilise pas beaucoup ce qui pourrait probablement être beaucoup mieux, mais voici ce que je l'ai fait.
Tout d'abord, je compila les Ntfs.ExtendedFileInfo du poste de Goyuix. Je mets la DLL dans mon répertoire de profil Powershell (Documents \ windowspowershell)
Ensuite, je créé un fichier dans mon répertoire de profil nommé My.Types.ps1xml.
Je mets le code XML suivant dans le fichier:
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>CompressedSize</Name>
<GetScriptBlock>
[Ntfs.ExtendedFileInfo]::GetCompressedFileSize($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Ce code (une fois fusionné dans le système de type) ajoutera dynamiquement une propriété nommée CompressedSize aux objets FileInfo renvoyés par get-childitem/dir.Mais Powershell ne connaît pas encore le code, et il ne connaît pas encore ma DLL. Nous traitons cela à l'étape suivante:
Modifier le profil.ps1. dans le même répertoire. Maintenant, mon fichier de profil contient déjà des éléments car les Extensions de communauté pour PowerShell sont installées. Heureusement, j'inclus tout ce dont vous avez besoin dans cet extrait de code suivant, afin qu'il fonctionne même sur une machine qui n'a pas les extensions. Ajoutez le code suivant à 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
Maintenant, la variable $ ProfileDir que je référence est défini plus tôt dans mon script Profile.ps1. Juste au cas où ce n'est pas dans le vôtre, voici la définition:
$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent
C'est tout. La prochaine fois que vous exécutez Powershell, vous pouvez accéder à la propriété CompressedSize sur l'objet FileInfo comme s'il s'agissait d'une autre propriété. Exemple:
$ myFile = dir c: \ temp \ myfile.txt
$ myFile.CompressedSize
Cela fonctionne (sur ma machine, de toute façon), mais j'aimerais entendre si elle correspond avec les meilleures pratiques. Une chose que je sais que je fais mal: dans le fichier Profile.ps1, je retourne les résultats de LoadFile dans une variable que je ne vais pas utiliser ($ null = bla bla). Je l'ai fait pour supprimer l'affichage du résultat du fichier de chargement à la console. Il y a probablement une meilleure façon de le faire.
Voulez-vous inclure l'espace sur le disque gaspillé en raison d'espace de cluster utilisé? (c'est délicat avec de petits fichiers en raison de l'inlining dans le MFT) ou est juste l'aspect compressé suffisant – ShuggyCoUk