2012-03-09 5 views
5

Tome la sencilla HashTable:¿Por qué Get-Date parece devolver objetos DateTime, pero el BinarySerializer indica que devuelve un PSObject?

$data = @{ 
    First = 'Justin'; 
    Last = 'Dearing'; 
    StartDate = Get-Date '2002-03-23'; 
} 

startdate clave parece contener una DateTime.

C:\Users\zippy\Documents> $data.StartDate.GetType().FullName 
System.DateTime 

Sin embargo, si intento para realizar la serialización binaria en él, me sale una excepción quejaba de que PSObject no es serializable.

$ms = New-Object System.IO.MemoryStream 
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
$bf.Serialize($ms, $data) 
$ms.Close() 

Lanza:

DocumentsException calling "Serialize" with "2" argument(s): "Type 'System.Management.Automation.PSObject' in Assembly 'System.Management.Automation, Versio 
n=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable." 
At C:\Users\jdearing\AppData\Local\Temp\b8967f99-0a24-41f7-9c97-dad2bc288bd9.ps1:12 char:14 
+ $bf.Serialize <<<< ($ms, $data) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

este mensaje desaparece y todo funciona si uso una conversión explícita a [Fecha y hora], así:

$data = @{ 
    First = 'Justin'; 
    Last = 'Dearing'; 
    StartDate = [DateTime] (Get-Date '2002-03-23'); 
} 

Así es Get-Date no es realmente devolviendo un DateTime, o hay alguna otra rareza de powershell en acción aquí.

+0

Creo que todo en PS tiene como 'PSObject' a menos que defina explícitamente el tipo. Realiza conversiones de tipos de datos dinámicos, por lo que podría devolver una cadena que interpreta como 'System.Datetime' en tiempo de ejecución. – JNK

+0

@JNK pero ¿por qué Object.GetType() interpreta algo como un DateTime que el formateador binario interpreta como PSObject? –

+0

Esto es solo adivinar, pero tal vez porque se interpreta en tiempo de ejecución (ya que está ejecutando el método 'GetType()' de un objeto PSObject) - el formateador binario es una clase del sistema, no una clase PS – JNK

Respuesta

3

Cada objeto en powershell está realmente envuelto principalmente de forma transparente en un psobject. Digo principalmente de forma transparente porque hay más de unos pocos errores en PowerShell que omiten eliminar el contenedor antes de filtrar el objeto a otra API. Esto causa todo tipo de problemas, como el que ves ahora. Busque connect.microsoft.com/powershell para el contenedor de psobject. Creo que esto ya no es un problema en v3 con el nuevo motor basado en DLR.

+0

Acabo de encender VirtualBox y el código funciona. Gracias por aclararlo. –

+1

aquí hay otro ejemplo donde psobject arruina las cosas; http://stackoverflow.com/questions/837095/why-does-powershells-return-keyword-cause-type-errors – x0n

+0

gracias por señalar eso. Lectura interesante –

5

Base en el MSDN:

PSOobject Clase: encapsula un objeto de base de tipo de objeto o escriba PSCustomObject para permitir una visión consistente de cualquier objeto en el entorno Windows PowerShell.

(get-Date '2002-03-23') -IS [psobject] 
True 

(get-Date '2002-03-23') -IS [datetime] 
True 

[datetime](get-Date '2002-03-23') -IS [datetime] 
True 

[datetime](get-Date '2002-03-23') -IS [psobject] 
False 
Cuestiones relacionadas