(edit)
ho capito come aggiungere dinamicamente una proprietà (chiamato "proprietà script") al FileObject, così ora, posso utilizzare la sintassi: $ theFileObject.CompressedSize di leggere il formato.
(fine edit)
risposta Leggi Goyuix di, e ho pensato "Cool, ma non c'è qualche tipo di capacità di tipo-extension in PowerShell?". Quindi ho trovato questo post di Scott Hanselman: http://www.hanselman.com/blog/MakingJunctionsReparsePointsVisibleInPowerShell.aspx
E ho creato una proprietà di script per l'oggetto FileInfo: CompressedSize.
Ecco quello che ho fatto: (nota: Sono abbastanza nuovo a PowerShell, o almeno io non lo uso molto questo potrebbe probabilmente essere fatto molto meglio, ma ecco quello che ho fatto:.
in primo luogo, ho compilato il Ntfs.ExtendedFileInfo dal post di Goyuix. ho messo la DLL nella cartella del mio profilo PowerShell (Documents \ WindowsPowerShell)
Successivamente, ho creato un file nel mio profilo directory denominata My.Types.ps1xml.
Inserisco il seguente codice XML nel file:
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<ScriptProperty>
<Name>CompressedSize</Name>
<GetScriptBlock>
[Ntfs.ExtendedFileInfo]::GetCompressedFileSize($this.FullName)
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Tale codice (una volta unito al sistema di tipi) aggiungerà dinamicamente una proprietà denominata CompressedSize agli oggetti FileInfo restituiti da get-Childitem/dir.Ma Powershell non è ancora al corrente del codice, e non conosce ancora la mia DLL. Lo gestiamo nel passaggio successivo:
Modifica profilo.ps1. nella stessa directory. Ora, il mio file Profile ha già alcune cose perché ho le estensioni della Community per powershell installate. Spero di aver incluso tutto ciò che ti serve in questo prossimo frammento di codice, in modo che funzioni anche su una macchina che non ha le estensioni. Aggiungere il seguente codice a 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
Ora, la variabile $ ProfileDir che ho di riferimento è definito in precedenza nel mio script Profile.ps1. Solo nel caso che non è nel tuo, qui è la definizione:
$ProfileDir = split-path $MyInvocation.MyCommand.Path -Parent
Questo è tutto. Alla successiva esecuzione di Powershell, è possibile accedere alla proprietà CompressedSize sull'oggetto FileInfo come se fosse un'altra proprietà. Esempio:
$ myFile = dir c: \ temp \ myfile.txt
$ myFile.CompressedSize
Questo funziona (sulla mia macchina, comunque), ma mi piacerebbe sentire se va bene con le migliori pratiche. Una cosa so che sto sbagliando: nel file Profile.ps1, restituisco i risultati di LoadFile in una variabile che non userò ($ null = blah blah). L'ho fatto per sopprimere la visualizzazione del risultato del file di caricamento sulla console. C'è probabilmente un modo migliore per farlo.
Vuoi includere lo spazio su disco sprecato a causa di spazio inutilizzato grappolo? (questo è complicato con file di piccole dimensioni a causa dell'inlining nella MFT) o è solo l'aspetto compresso sufficiente – ShuggyCoUk