C’è spesso una certa confusione per quanto riguarda le differenze tra l’utilizzo di New-Object PSObject e PSCustomObject, così come il modo in cui i due funzionano.
Entrambi gli approcci possono essere utilizzati per prendere un insieme di valori da una raccolta di oggetti PowerShell e raggrupparli in una singola uscita. Inoltre, entrambe le strade produrranno i dati come proprietà NoteProperties nel sistema.Gestione.Automazione.Tipi di oggetto PSCustomObject. Allora, qual e ‘ il problema tra loro?
Per cominciare, il cmdlet New-Object è stato introdotto in PowerShell v1.0 e ha subito una serie di modifiche, mentre l’uso della classe PSCustomObject è arrivato più tardi nella v3.0. Per i sistemi che utilizzano PowerShell v2.0 o versioni precedenti, è necessario utilizzare New-Object. La differenza chiave tra la versione 2.0 e la versione 1.0 da un punto di vista amministrativo è che 2.0 consente l’uso di tabelle hash. Ad esempio:
$Path = "c:\scripts"$Directory = Get-Acl -Path $PathForEach ($Dir in $Directory.Access){$DirPermissions = New-Object -TypeName PSObject$DirPermissions | Add-Member -MemberType NoteProperty -Name Path -Value $Path$DirPermissions | Add-Member -MemberType NoteProperty -Name Owner -Value $Directory.Owner$DirPermissions | Add-Member -MemberType NoteProperty -Name Group -Value $Dir.IdentityReference$DirPermissions | Add-Member -MemberType NoteProperty -Name AccessType -Value $Dir.AccessControlType$DirPermissions | Add-Member -MemberType NoteProperty -Name Rights -Value $Dir.FileSystemRights$DirPermissions}
Con il metodo New-Object in PowerShell v1.0, è necessario dichiarare il tipo di oggetto che si desidera creare e aggiungere membri alla raccolta in singoli comandi. Questo è cambiato tuttavia in v2.0 con la possibilità di utilizzare hashtable:
New-Object in PS 2.0
$Path = "c:\scripts"$Directory = Get-Acl -Path $PathForEach ($Dir in $Directory.Access){$DirPermissions = New-Object -TypeName PSObject -Property @{'Path' = $Path'Owner' = $Directory.Owner'Group' = $Dir.IdentityReference'AccessType' = $Dir.AccessControlType'Rights' = $Dir.FileSystemRights}$DirPermissions}
Ecco l’output:
Questo ha salvato un sacco di overhead nella digitazione e fornito un cleaner in cerca di script. Tuttavia, entrambi i metodi hanno lo stesso problema in quanto l’output non è necessariamente nello stesso ordine in cui è stato elencato, quindi se stai cercando un particolare formato, potrebbe non funzionare. PSCustomObject risolto questo problema quando è stato introdotto nella v3.0, oltre a fornire una maggiore semplificazione negli script.
PSCustomObject in PowerShell v3.0
$Path = "c:\scripts"$Directory = Get-Acl -Path $PathForEach ($Dir in $Directory.Access){@{Path = $PathOwner = $Directory.OwnerGroup = $Dir.IdentityReferenceAccessType = $Dir.AccessControlTypeRights = $Dir.FileSystemRights}#EndPSCustomObject}#EndForEach
Come dimostrato, l’output sarà sempre corrispondono a ciò che hai definito nel tuo hashtable. Un altro vantaggio dell’utilizzo di PSCustomObject è che è stato notato per enumerare i dati più velocemente rispetto alla sua controparte New-Object. L’unica cosa da tenere a mente con PSCustomObject è che non funzionerà con i sistemi che eseguono PSv2.0 o versioni precedenti.