5

シンプルな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');
}

Get-Date が実際には DateTime を返さないか、またはここで動作している他の PowerShell の奇妙な点も同様です。

4

2 に答える 2

5

MSDNに基づく:

PSOobject クラス:

Object 型または 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
于 2012-03-09T15:59:40.047 に答える
3

PowerShell のすべてのオブジェクトは、実際にはほとんど透過的にPSObjectにラップされています。オブジェクトを別の API にリークする前にラッパーを削除することを省略している PowerShell のバグがいくつかあるため、私はほとんど透過的に言います。これは、現在見られるようなあらゆる種類の問題を引き起こします。connect.microsoft.com/powershell で PSObject ラッパーを検索してください。これは、新しいDLRベースのエンジンを使用する v3 ではもはや問題ではないと考えています。

于 2012-03-09T17:34:56.627 に答える