ARGOMENTO about_Types.ps1xml DESCRIZIONE BREVE Illustra la modalità in cui i file Types.ps1xml consentono di estendere i tipi Microsoft .NET Framework degli oggetti utilizzati in Windows PowerShell. DESCRIZIONE DETTAGLIATA Il file Types.ps1xml della directory di installazione ($pshome) di Windows PowerShell è un file di testo basato su XML che consente di aggiungere proprietà e metodi agli oggetti utilizzati in Windows PowerShell. Windows PowerShell dispone di un file Types.ps1xml predefinito che aggiunge diversi elementi ai tipi .NET Framework. È tuttavia possibile creare file Types.ps1xml aggiuntivi per estendere ulteriormente i tipi. Ad esempio, per impostazione predefinita, gli oggetti matrice (System.Array) dispongono di una proprietà Length che elenca il numero di oggetti nella matrice. Tuttavia, poiché il nome "length" non descrive chiaramente la proprietà, viene aggiunta una proprietà alias denominata "Count" che visualizza lo stesso valore. Il codice XML seguente aggiunte la proprietà Count al tipo System.Array. <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName> Length </ReferencedMemberName> </AliasProperty> </Members> </Type> Per ottenere il nuovo oggetto AliasProperty, utilizzare un comando Get-Member su qualsiasi matrice, come mostrato nell'esempio seguente. Get-Member -inputobject (1,2,3,4) Il comando restituisce i risultati seguenti. Name MemberType Definition ---- ---------- ---------- Count AliasProperty Count = Length Address Method System.Object& Address(Int32 ) Clone Method System.Object Clone() CopyTo Method System.Void CopyTo(Array array, Int32 index): Equals Method System.Boolean Equals(Object obj) Get Method System.Object Get(Int32 ) ... Di conseguenza, è possibile utilizzare la proprietà Count o la proprietà Length delle matrici in Windows PowerShell. Ad esempio: C:\PS> (1, 2, 3, 4).count 4 C:\PS> (1, 2, 3, 4).length 4 Creazione di nuovi file Types.ps1xml I file .ps1xml installati con Windows PowerShell sono firmati digitalmente per impedirne l'alterazione poiché la formattazione può includere blocchi di script. Pertanto, per aggiungere una proprietà o un metodo a un tipo .NET Framework, creare file Types.ps1xml, quindi aggiungerli alla console di Windows PowerShell. Per creare un nuovo file, iniziare copiando un file Types.ps1xml esistente. Il nuovo file può avere qualsiasi nome ma deve avere estensione .ps1xml. È possibile inserire il nuovo file in qualsiasi directory accessibile a Windows PowerShell, ma è consigliabile inserirlo nella directory di installazione ($pshome) di Windows PowerShell o in una sottodirectory della directory di installazione. Dopo aver salvato il nuovo file, utilizzare il cmdlet Update-TypeData per aggiungerlo alla console di Windows PowerShell. Se si desidera che i tipi abbiano la precedenza sui tipi definiti nel file predefinito, utilizzare il parametro PrependData del cmdlet Update-TypeData. Update-TypeData ha effetto solo sulla console corrente. Per apportare la modifica a tutte le console future, esportare la console o aggiungere il comando Update-TypeData al profilo di Windows PowerShell. Types.ps1xml e Add-Member I file Types.ps1xml aggiungono proprietà e metodi a tutte le istanze degli oggetti del tipo .NET Framework specificato nella console di Windows PowerShell interessata. Tuttavia, se è necessario aggiungere proprietà o metodi solo a un'istanza di un oggetto, utilizzare il cmdlet Add-Member. Per ulteriori informazioni, vedere Add-Member. Esempio: aggiunta di un membro Age agli oggetti FileInfo In questo esempio viene illustrato come aggiungere una proprietà Age agli oggetti file (System.IO.FileInfo). L'età di un file è la differenza in giorni tra la data di creazione e la data corrente. È più semplice utilizzare il file Types.ps1xml originale come modello per il nuovo file. Il comando seguente copia il file originale in un file denominato MyTypes.ps1xml della directory $pshome. copy-item Types.ps1xml MyTypes.ps1xml Quindi, apre il file Types.ps1xml in un editor XML o di testo, quale Blocco note. Poiché la proprietà Age è calcolata utilizzando un blocco di script, trovare un tag <ScriptProperty> da utilizzare come modello per la proprietà Age. Copiare il codice XML compreso tra i tag <Type> e </Type> per creare la proprietà script. Quindi, eliminare la parte restante del file, tranne i tag di apertura <?xml> e <Types> e il tag di chiusura </Types>. È necessario eliminare anche la firma digitale per evitare errori. Iniziare con la proprietà script modello, ad esempio la proprietà script seguente, copiata dal file Types.ps1xml originale. <?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.Guid</Name> <Members> <ScriptProperty> <Name>Guid</Name> <GetScriptBlock>$this.ToString()</GetScrip tBlock> </ScriptProperty> </Members> </Type> </Types> Quindi, modificare il nome del tipo .NET Framework, il nome della proprietà e il valore del blocco di script per creare una proprietà Age per gli oggetti file. <?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.IO.FileInfo</Name> <Members> <ScriptProperty> <Name>Age</Name> <GetScriptBlock> ((get-date) - ($this.creationtime)).days </GetScriptBlock> </ScriptProperty> </Members> </Type> </Types> Dopo aver salvato e chiuso il file, utilizzare un comando Update-TypeData, come il seguente, per aggiungere il nuovo file Types.ps1xml alla console corrente. Il comando utilizza il parametro PrependData per inserire il nuovo file in un ordine di precedenza maggiore al file precedente. Per ulteriori informazioni su Update-TypeData, vedere Update-TypeData. update-typedata -prependpath $pshome\MyTypes.ps1xml Per eseguire il test della modifica, utilizzare un comando Get-ChildItem per ottenere il file PowerShell.exe della directory $pshome, quindi reindirizzare il file al cmdlet Format-List per elencare tutte le proprietà del file. Come risultato della modifica, la proprietà Age viene visualizzata nell'elenco. get-childitem $pshome\powershell.exe | format-list -property * PSPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS... PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS... PSChildName : powershell.exe PSDrive : C PSProvider : Microsoft.PowerShell.Core\FileSystem PSIsContainer : False Age : 16 VersionInfo : File: C:\WINDOWS\system32\WindowsPow... InternalName: POWERSHELL OriginalFilename: PowerShell.EXE ... È anche possibile visualizzare la proprietà Age del file tramite il comando seguente. (get-childitem $pshome\powershell.exe).age 16 Codice XML nei file Types.ps1xml Il tag <Types> racchiude tutti i tipi definiti nel file. Deve essere presente una sola coppia di tag <Types>. Ogni tipo .NET Framework indicato nel file deve essere rappresentato da una coppia di tag <Type>. I tag tipo devono contenere i tag seguenti: <Name>: una coppia di tag <Name> che racchiudono il nome del tipo .NET Framework interessato. <Members>: una coppia di tag <Members> che racchiudono i tag per le nuove proprietà e i metodi definiti per il tipo .NET Framework. All'interno dei tag <Members> può essere presente qualsiasi dei seguenti tag membro. <AliasProperty>: definisce un nuovo nome per una proprietà esistente. Il tag <AliasProperty> deve includere una coppia di tag <Name> che specifica il nome della nuova proprietà e una coppia di tag <ReferencedMemberName> che specifica la proprietà esistente. Ad esempio, la proprietà alias Count è un alias per la proprietà Length degli oggetti matrice. <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName>Length</ReferencedMembe rName> </AliasProperty> </Members> </Type> <CodeMethod>: fa riferimento a un metodo statico di una classe .NET Framework. Il tag <CodeMethod> deve presentare una coppia di tag <Name> che specificano il nome del nuovo metodo e una coppia di tag <GetCodeReference> che specificano il codice in cui il metodo è definito. Ad esempio, la proprietà Mode delle directory (oggetti System.IO.DirectoryInfo) è una proprietà di codice definita nel provider FileSystem di Windows PowerShell. <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <CodeProperty> <Name>Mode</Name> <GetCodeReference> <TypeName>Microsoft.PowerShell.Commands. FileSystemProvider</TypeName> <MethodName>Mode</MethodName> </GetCodeReference> </CodeProperty> </Members> </Type> <CodeProperty>: fa riferimento a un metodo statico di una classe .NET Framework. Il tag <CodeProperty> deve presentare una coppia di tag <Name> che specificano il nome della nuova proprietà e una coppia di tag <GetCodeReference> che specificano il codice in cui la proprietà è definita. Ad esempio, la proprietà Mode delle directory (oggetti System.IO.DirectoryInfo) è una proprietà di codice definita nel provider FileSystem di Windows PowerShell. <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <CodeProperty> <Name>Mode</Name> <GetCodeReference> <TypeName>Microsoft.PowerShell.Commands. FileSystemProvider</TypeName> <MethodName>Mode</MethodName> </GetCodeReference> </CodeProperty> </Members> </Type> <MemberSet>: definisce una raccolta di membri (proprietà e metodi). I tag <MemberSet> vengono riportati all'interno dei tag <Members> primari. Devono includere una coppia di tag <Name> che racchiudano il nome del set di membri e una coppi di tag <Members> secondari che racchiudano i membri (proprietà e metodi) nel set. Qualsiasi dei tag che creano una proprietà (ad esempio <NoteProperty> o <ScriptProperty>) o un metodo (ad esempio <Method> o <ScriptMethod>) possono essere membri del set. Nei file Types.ps1xml, il tag <MemberSet> è utilizzato per definire le visualizzazioni predefinite degli oggetti .NET Framework in Windows PowerShell. In questo caso, il nome del set di membri (il valore racchiuso tra i tag <Name>) è sempre "PsStandardMembers" e il nomi del tag proprietà (il valore di <Name>) sono uno dei seguenti: - DefaultDisplayProperty: una singola proprietà di un oggetto. - DefaultDisplayPropertySet: una o più proprietà di un oggetto. - DefaultKeyPropertySet: una o più proprietà chiave di un oggetto. Una proprietà chiave identifica le istanze di valori chiave, ad esempio il numero ID degli elementi in una cronologia della sessione. Ad esempio, il codice XML seguente definisce la visualizzazione predefinita dei servizi (oggetti System.ServiceProcess.ServiceController) restituiti dal cmdlet Get-Service. Definisce un set di membri denominato "PsStandardMembers" costituito da un set di proprietà predefinito con le proprietà Status, Name e DisplayName. <Type> <Name>System.ServiceProcess.ServiceController</Name> <Members> <MemberSet> <Name>PSStandardMembers</Name> <Members> <PropertySet> <Name>DefaultDisplayPropertySet</Name> <ReferencedProperties> <Name>Status</Name> <Name>Name</Name> <Name>DisplayName</Name> </ReferencedProperties> </PropertySet> </Members> </MemberSet> </Members> </Type> <Method>: fa riferimento a un metodo nativo dell'oggetto sottostante. <Methods>: raccolta dei metodi dell'oggetto. <NoteProperty>: definisce una proprietà con un valore statico. Il tag <NoteProperty> deve presentare una coppia di tag <Name> che specificano il nome della nuova proprietà e una coppia di tag <Value> che specificano il valore della proprietà. Ad esempio, il codice XML seguente crea una proprietà Status per le directory (oggetti System.IO.DirectoryInfo). Il valore della proprietà Status è sempre "Success". <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <NoteProperty> <Name>Status</Name> <Value>Success</Value> </NoteProperty> </Members> </Type> <ParameterizedProperty>: proprietà che accettano argomenti e restituiscono un valore. <Properties>: raccolta delle proprietà dell'oggetto. <Property>: proprietà dell'oggetto di base. <PropertySet>: definisce una raccolta delle proprietà dell'oggetto. Il tag <PropertySet> deve includere una coppia di tag <Name> che specificano il nome del set di proprietà e una coppia di <ReferencedProperty> che specificano le proprietà. I nomi delle proprietà sono racchiusi nelle coppie di tag <Name>. In Types.ps1xml, i tag <PropertySet> sono utilizzati per definire set di proprietà per la visualizzazione predefinita di un oggetto. È possibile identificare le visualizzazioni predefinite mediante il valore "PsStandardMembers" nel tag <Name> di un tag <MemberSet>. Ad esempio, il codice XML seguente crea una proprietà Status per le directory (oggetti System.IO.DirectoryInfo). Il valore della proprietà Status è sempre "Success". <Type> <Name>System.ServiceProcess.ServiceController</Name> <Members> <MemberSet> <Name>PSStandardMembers</Name> <Members> <PropertySet> <Name>DefaultDisplayPropertySet</Name> <ReferencedProperties> <Name>Status</Name <Name>Name</Name> <Name>DisplayName</Name> </ReferencedProperties> </PropertySet> <Members> <MemberSet> <Members> <Type> <ScriptMethod>: definisce un metodo il cui valore è l'output di uno script. Il tag <ScriptMethod> deve includere una coppia di tag <Name> che specificano il nome del nuovo metodo e una coppia di tag <Script> che racchiudono il blocco di script che restituisce il risultato del metodo. Ad esempio, i metodi ConvertToDateTime e ConvertFromDateTime degli oggetti di gestione (System.System.Management.Managemen tObject) sono metodi di script che utilizzano i metodi statici ToDateTime e ToDmtfDateTime della classe System.Management.ManagementDateTimeConverter. <Type> <Name>System.Management.ManagementObject</Name> <Members> <ScriptMethod> <Name>ConvertToDateTime</Name> <Script> [System.Management.ManagementDateTimeConverter] ::ToDateTime($args[0]) </Script> </ScriptMethod> <ScriptMethod> <Name>ConvertFromDateTime</Name> <Script> [System.Management. ManagementDateTimeConverter] ::ToDmtfDateTime($args[0]) </Script> </ScriptMethod> </Members> </Type> <ScriptProperty>: definisce una proprietà il cui valore è l'output di uno script. Il tag <ScriptProperty> deve includere una coppia di tag <Name> che specificano il nome della nuova proprietà e una coppia di tag <Script> che racchiudono il blocco di script che restituisce il valore della proprietà. Ad esempio, la proprietà VersionInfo dei file (oggetti System.IO.FileInfo) è una proprietà script risultante dall'utilizzo della proprietà FullName del metodo statico GetVersionInfo degli oggetti System.Diagnostics.FileVersionInfo. <Type> <Name>System.IO.FileInfo</Name> <Members> <ScriptProperty> <Name>VersionInfo</Name> <GetScriptBlock> [System.Diagnostics.FileVersionInfo]::GetVersionInfo ($this.FullName) </GetScriptBlock> </ScriptProperty> </Members> </Type> Per ulteriori informazioni, vedere Windows PowerShell Software Development Kit (SDK) in MSDN Library all'indirizzo https://go.microsoft.com/fwlink/?LinkId=144538 (le informazioni potrebbero essere in lingua inglese). Update-TypeData Per caricare i file Types.ps1xml in una console di Windows PowerShell, utilizzare il cmdlet Update-TypeData. Se si desidera che i tipi nel file abbiano la precedenza sui tipi nel file Types.ps1xml predefinito, utilizzare il parametro PrependData di Update-TypeData. Update-TypeData ha effetto solo sulla console corrente. Per apportare la modifica a tutte le console future, esportare la console o aggiungere il comando Update-TypeData al profilo di Windows PowerShell. Firma di un file Types.ps1xml Per proteggere gli utenti del file Types.ps1xml, è possibile firmare il file utilizzando una firma digitale. Per ulteriori informazioni, vedere about_Signing. VEDERE ANCHE about_Signing Copy-Item Get-Member Update-TypeData