powershell powershell-v2.0

powershell - Potencia Shell. Crear un archivo de clase para contener objetos personalizados?



powershell-v2.0 (3)

Uso el comando de objetos personalizados de Powershell para mantener los puntos de datos. Custom-object crea solo un objeto y le asigna una variable. ¿Puede Powershell ir un paso más allá y crear nuevas clases a partir de las cuales se pueden crear objetos?

En los ejemplos a continuación, almaceno tres datos: un nombre de servidor, una marca de tiempo y los minutos desde que ocurrió un evento en el servidor.

Cuando estaba aprendiendo Powershell, puse todo esto en una matriz bidimensional:

$record = @("Server","Timestamp","Minutes") for ($j = 0; $j -lt 10; $j++){ $record += @("Server1","$(get-date)",$j) sleep 60 } $record | export-csv -path c:/record.csv -no type information

export-csv no funciona bien con las matrices, así que comencé a usar un objeto personalizado:

$record = @() for ($j = 0; $j -lt 10; $j++){ $r = New-Object -TypeName PSObject $r | Add-Member -MemberType NoteProperty -Name Server -Value "" $r | Add-Member -MemberType NoteProperty -Name Timesteamp -Value "" $r | Add-Member -MemberType NoteProperty -Name Minutes -Value "" $r.server = "Server1" $r.timestamp = "$(get-date)" $r.minutes = "$j" $record += $r sleep 60 } $record | export-csv -path c:/record.csv -no type information

Eso es exportar correctamente, y tratar con las propiedades de los objetos es más fácil que lidiar con columnas en una matriz bidimensional.

Pero si quiero crear varios objetos personalizados que no están en una matriz, tengo que escribir el código de objeto personalizado una y otra vez.

$server1 = New-Object -TypeName PSObject $server1 | Add-Member -MemberType NoteProperty -Name Server -Value "" $server1 | Add-Member -MemberType NoteProperty -Name Timesteamp -Value "" $server2 = New-Object -TypeName PSObject $server2 | Add-Member -MemberType NoteProperty -Name Server -Value "" $server2 | Add-Member -MemberType NoteProperty -Name Timesteamp -Value "" #ad nauseum

¿Qué sucede si Powershell puede diseñar clases personalizadas además de objetos personalizados? Al igual que los lenguajes de programación OO? Algo como:

class record { -MemberType NoteProperty -Name Server -Value "" -MemberType NoteProperty -Name Timestamp -Value "" -MemberType NoteProperty -Name Minutes -Value "" } $server1 = new-object -TypeName record $server2 = new-object -TypeName record $server3 = new-object -TypeName record

¿Es eso posible en Powershell?


Puede definir clases en PowerShell.

Add-Type -Language CSharp @" public class Record{ public System.DateTime TimeStamp; public string Server; public int Minutes; } "@; $MyRecord = new-object Record; $MyRecord.Server = "myserver"; $MyRecord.Timestamp = Get-Date; $MyRecord.Minutes = 15;


Puede usar una función como constructor de faux para sus objetos personalizados. Nunca tendría que duplicar su código, y podría usar indicadores para establecer sus propiedades directamente desde la llamada a la función. Aquí hay un ejemplo:

Function New-Constructor { param ( [string]$Name, [DateTime]$TimeStamp = (Get-Date) ) $server = New-Object -TypeName PSObject $server | Add-Member -MemberType NoteProperty -Name Server -Value $Name $server | Add-Member -MemberType NoteProperty -Name TimeStamp -Value $TimeStamp # Calling "server" below outputs it, acting as a "return" value $server }

Y algunos resultados de muestra:

PS C:/> New-Constructor -Name "MyServer" Server TimeStamp ------ --------- MyServer 9/9/2013 3:27:47 PM PS C:/> $myServer = New-Constructor -Name "MyServer" PS C:/> $myServer Server TimeStamp ------ --------- MyServer 9/9/2013 3:27:57 PM PS C:/> $newServer = New-Constructor -Name "NS" -TimeStamp (Get-Date).AddDays(-1) PS C:/> $newServer Server TimeStamp ------ --------- NS 9/8/2013 3:33:00 PM

Puedes hacer un montón de cosas con funciones que están fuera del alcance de esta pregunta. En cambio, echa un vistazo a about_functions_advanced .


Otra opción.

Propiedades

Puede reemplazar el valor ''$ null'' del mensaje de propiedad para tener un valor inicial. El objeto Prop es una tabla hash de claves (propiedades) y valores (valores iniciales).

$messageClass = New-Object -TypeName PSObject -Prop @{ message = $null; }

Métodos

$messageClass | Add-Member -MemberType ScriptMethod -Name "ShowMessage" -Value { Try { Write-Host $this.message } Catch { Throw $_.Exception } }

Constructores

El código a continuación describe un constructor. El polimorfismo se logra usando [Parámetro (Obligatorio = $ falso)] para afirmar o no la provisión del parámetro especificado.

function MessageClass { param([Parameter(Mandatory=$true)] [String]$mandatoryMessage, [Parameter(Mandatory=$false)] [String]$optionalMessage) $messageObj = $messageClass.psobject.copy() if ($optionalMessage) { $messageObj.message = "$mandatoryMessage $optionalMessage!" } else { $messageObj.message = "$mandatoryMessage!" } $messageObj }

El constructor se puede llamar así:

$var1 = ''Hello'' $var2 = ''World'' $example1 = MessageClass -mandatoryMessage $var1 $example2 = MessageClass -mandatoryMessage $var1 -optionalMessage $var2

Para mostrar el texto:

$example1.ShowMessage() $example2.ShowMessage()

Los resultados serían:

¡Hola!

Hola Mundo!