GetType ที่ใช้ใน PowerShell ความแตกต่างระหว่างตัวแปร


92

อะไรคือความแตกต่างระหว่างตัวแปร$aและ$b?

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

ผมพยายามตรวจสอบ

$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

แต่ดูเหมือนว่าจะไม่มีความแตกต่างแม้ว่าผลลัพธ์ของตัวแปรเหล่านี้จะดูแตกต่างกัน

คำตอบ:


163

ก่อนอื่นคุณไม่มีวงเล็บในการเรียก GetType สิ่งที่คุณเห็นคือ MethodInfo ที่อธิบายถึงเมธอด GetType ใน [DayOfWeek] ในการเรียก GetType จริงๆคุณควรทำ:

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

คุณจะเห็นว่านั่น$aคือ [DayOfWeek] และ$bเป็นอ็อบเจ็กต์แบบกำหนดเองที่สร้างโดยSelect-Object cmdlet เพื่อจับเฉพาะคุณสมบัติ DayOfWeek ของอ็อบเจ็กต์ข้อมูล ดังนั้นจึงเป็นวัตถุที่มีคุณสมบัติ DayOfWeek เท่านั้น:

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

20

Select-Object สร้าง psobject ใหม่และคัดลอกคุณสมบัติที่คุณร้องขอไป คุณสามารถตรวจสอบได้ด้วย GetType ():

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

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

10

Select-Objectส่งคืนPSObjectแบบกำหนดเองพร้อมคุณสมบัติที่ระบุ แม้จะมีคุณสมบัติเดียวคุณก็ไม่ได้รับตัวแปร ACTUAL มันถูกห่อไว้ภายใน PSObject

ให้ทำ:

Get-Date | Select-Object -ExpandProperty DayOfWeek

ซึ่งจะทำให้คุณได้ผลลัพธ์เช่นเดียวกับ:

(Get-Date).DayOfWeek

ความแตกต่างก็คือถ้าGet-Dateส่งคืนอ็อบเจ็กต์หลายรายการวิธีไปป์ไลน์จะทำงานได้ดีกว่าวิธีการจัดอันดับ(Get-ChildItem)เช่นอาร์เรย์ของรายการ สิ่งนี้มีการเปลี่ยนแปลงใน PowerShell v3 และ(Get-ChildItem).FullPathทำงานตามที่คาดไว้และส่งคืนอาร์เรย์ของเส้นทางแบบเต็มเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.