2012-03-09 35 views
5

Lấy đơn giản HashTable:Tại sao Get-Date dường như trả về đối tượng DateTime, nhưng BinarySerializer cho biết nó trả về một PSObject?

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

Các StartDate chủ chốt dường như chứa một DateTime.

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

Tuy nhiên, nếu tôi cố thực hiện tuần tự hóa nhị phân trên đó, tôi nhận được ngoại lệ khiếu nại PSObject không thể nối tiếp.

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

Ném:

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 

Thông báo này sẽ biến mất và mọi thứ hoạt động nếu tôi sử dụng một dàn diễn viên rõ ràng để [DateTime] như vậy:

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

Vậy là Get-Date không thực sự trả về một DateTime, hoặc là một số quyền hạn khác của powerhell tại nơi làm việc ở đây.

+0

Tôi nghĩ mọi thứ trong PS mặc định là 'PSObject' trừ khi bạn xác định rõ ràng loại. Nó thực hiện chuyển đổi kiểu dữ liệu động, do đó, nó có thể chỉ trả về một chuỗi mà nó diễn giải dưới dạng 'System.Datetime' khi chạy. – JNK

+0

@JNK nhưng tại sao Object.GetType() giải thích một cái gì đó như một DateTime mà trình định dạng nhị phân diễn giải như PSObject? –

+0

Đây chỉ là đoán, nhưng có thể bởi vì nó đang được giải thích lúc chạy (vì bạn đang chạy phương thức 'GetType()' của PSObject) - trình định dạng nhị phân là một lớp hệ thống, không phải là lớp PS – JNK

Trả lời

3

Mọi đối tượng trong powershell thực sự được bao bọc chủ yếu trong suốt một psobject. Tôi nói chủ yếu là minh bạch bởi vì có nhiều hơn một vài lỗi trong PowerShell mà bỏ qua để loại bỏ các wrapper trước khi rò rỉ đối tượng để API khác. Điều này gây ra tất cả các loại vấn đề, giống như vấn đề bạn thấy bây giờ. Tìm kiếm connect.microsoft.com/powershell cho trình bao bọc psobject. Tôi tin rằng đây không còn là vấn đề trong v3 với động cơ dựa trên DLR mới.

+0

Chỉ cần kích hoạt VirtualBox và mã không hoạt động. Cảm ơn bạn đã làm rõ. –

+1

đây là một ví dụ khác mà vít psobject điều lên; http://stackoverflow.com/questions/837095/why-does-powershells-return-keyword-cause-type-errors – x0n

+0

cảm ơn vì đã chỉ ra điều đó. Thú vị đọc sách. –

5

Căn cứ vào MSDN:

PSOobject Class: Đóng gói một đối tượng cơ sở của kiểu Object hoặc gõ PSCustomObject để cho phép một cái nhìn nhất quán của bất kỳ đối tượng trong môi trường 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 
Các vấn đề liên quan