拍摄简单的 hashtable

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

密钥startdate似乎包含一个 datetime

C:\Users\zippy\Documents> $data.StartDate.GetType().FullName
System.DateTime
. 但是,如果我尝试对其执行二进制序列化,我会得到一个例外抱怨 psobject 不序列化。
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $data)
$ms.Close()
.

抛出:

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
.

此消息消失,一切都适用,如果我使用显式转换为[DateTime],如此:

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

所以获得 - 日期不是真正返回DateTime,或者是其他一些PowerShell奇怪在这里工作。

有帮助吗?

解决方案

PowerShell中的每个对象实际上都在PSObject中透明地呈现。我大多透明地说,因为PowerShell中有一个以上的错误,可以在将对象泄露到另一个API之前删除包装器。这会导致各种问题,就像你现在看到的那样。搜索connect.microsoft.com/powershell for psobject包装。我相信这在V3中不再是基于DLR的发动机的问题。

其他提示

在MSDN上的基础:

psoObject类: 封装类型对象的基础对象或类型pscustomobject,以允许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
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top