Почему Get-Date, кажется, возвращает объекты DateTime, но двоичный доступ указывает, что он возвращает Psobject?

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

Вопрос

Возьмите простые 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 на самом деле завернут в основном прозрачно в псобъекте.Я говорю в основном прозрачно, потому что в PowerShell есть более нескольких ошибок, которые пропускают, чтобы удалить обертку, прежде чем протекать объект к другому API.Это вызывает все виды проблем, как то, что вы видите сейчас.Поиск Connect.microsoft.com/powershell для обертки Psobject.Я считаю, что это больше не проблема в V3 с новым двигателем на основе DLR.

Другие советы

База на MSDN:

Класс Psoobject: Цикпсулирует базовый объект объекта типа или типа PSCHustomObject, чтобы обеспечить постоянный вид любого объекта в среде 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