GetType được sử dụng trong PowerShell, sự khác biệt giữa các biến


89

Sự khác biệt giữa các biến $a$b?

$a = (Get-Date).DayOfWeek
$b = Get-Date | Select-Object DayOfWeek

Tôi đã cố gắng kiểm tra

$a.GetType
$b.GetType

MemberType          : Method
OverloadDefinitions : {type GetType()}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : type GetType()
Name                : GetType
IsInstance          : True

MemberType          : Method
OverloadDefinitions : {type GetType()}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : type GetType()
Name                : GetType
IsInstance          : True

Nhưng dường như không có sự khác biệt mặc dù đầu ra của các biến này trông khác nhau.

Câu trả lời:


158

Trước hết, bạn thiếu dấu ngoặc đơn để gọi GetType. Những gì bạn thấy là MethodInfo mô tả phương thức GetType trên [DayOfWeek]. Để thực sự gọi GetType, bạn nên làm:

$a.GetType();
$b.GetType();

Bạn sẽ thấy đó $alà [DayOfWeek] và $blà đối tượng tùy chỉnh được tạo bởi lệnh ghép ngắn Select-Object để chỉ nắm bắt thuộc tính DayOfWeek của một đối tượng dữ liệu. Do đó, nó là một đối tượng chỉ có thuộc tính DayOfWeek:

C:\> $b.DayOfWeek -eq $a
True

20

Select-Object tạo một psobject mới và sao chép các thuộc tính bạn yêu cầu vào nó. Bạn có thể xác minh điều này bằng GetType ():

PS > $a.GetType().fullname
System.DayOfWeek

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject

10

Select-Object trả về một PSObject tùy chỉnh chỉ với các thuộc tính được chỉ định. Ngay cả với một thuộc tính duy nhất, bạn không nhận được biến ACTUAL; nó được bọc bên trong PSObject.

Thay vào đó, hãy làm:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Điều đó sẽ giúp bạn có được kết quả tương tự như:

(Get-Date).DayOfWeek

Sự khác biệt là nếu Get-Date trả về nhiều đối tượng, thì cách đường ống sẽ hoạt động tốt hơn so với cách trong ngoặc đơn (Get-ChildItem), chẳng hạn như là một mảng các mục. Điều này đã thay đổi trong PowerShell v3 và (Get-ChildItem).FullPathhoạt động như mong đợi và trả về một mảng chỉ gồm các đường dẫn đầy đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.