Perché il get-data sembra restituire gli oggetti DateTime, ma il binaryserializzatore indicano che restituisce un Psobject?

StackOverflow https://stackoverflow.com//questions/9636698

Domanda

Prendi il semplice hashtable :

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

La chiave StartDate sembra contenere un Datetime .

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

Tuttavia, se tento di eseguire la serializzazione binaria su di esso, ottengo un'eccezione che lamentava che Psobject non è serializzabile.

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

Gruppi:

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
.

Questo messaggio va via e tutto funziona se utilizzo un cast esplicito su [DateTime] come:

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

Quindi è il get-data non restituisce davvero un datetime, o è un'altra stranezza di PowerShell al lavoro qui.

È stato utile?

Soluzione

Ogni oggetto a PowerShell è effettivamente avvolto per lo più in modo trasparente in un Psobject.Dico per lo più in modo trasparente perché ci sono più di alcuni bug in PowerShell che omettono di rimuovere il wrapper prima di perdite dell'oggetto a un'altra API.Ciò causa tutti i tipi di problemi, proprio come quello che vedi ora.Cerca connect.microsoft.com/powershell per Psobject Wrapper.Credo che questo non sia più un problema in V3 con il nuovo motore basato su DLR.

Altri suggerimenti

Base su MSDN:

Psoobject Class: Incapsula un oggetto base dell'oggetto di tipo o digitare PscustomObject per consentire una visione coerente di qualsiasi oggetto all'interno dell'ambiente 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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top