Maybaygiare.org

Blog Network

New-Object PSObject vs. PSCustomObject

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 $Path
ForEach ($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 $Path
ForEach ($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:

Nota ordine di uscita vs. ordine in una tabella hash

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 $Path
ForEach ($Dir in $Directory.Access){
@{
Path = $Path
Owner = $Directory.Owner
Group = $Dir.IdentityReference
AccessType = $Dir.AccessControlType
Rights = $Dir.FileSystemRights
}#EndPSCustomObject
}#EndForEach

Nota l’ordine delle proprietà

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.