ค้นหาเว็บไซต์

เกี่ยวกับตัวดำเนินการประเภท


คำอธิบายสั้น ๆ

อธิบายตัวดำเนินการที่ทำงานกับประเภท Microsoft .NET

คำอธิบายยาว

ตัวดำเนินการประเภทบูลีน (-is และ -isnot) บอกว่าวัตถุเป็นอินสแตนซ์ของประเภท .NET ที่ระบุหรือไม่ ตัวดำเนินการ -is จะส่งกลับค่า TRUE หากประเภทตรงกัน มิฉะนั้นจะส่งกลับค่า FALSE ตัวดำเนินการ -isnot จะส่งกลับค่า FALSE หากประเภทตรงกันและค่า TRUE มิฉะนั้น

ตัวดำเนินการ -as พยายามแปลงวัตถุอินพุตเป็นประเภท .NET ที่ระบุ หากสำเร็จก็จะส่งคืนอ็อบเจ็กต์ที่แปลงแล้ว หากล้มเหลวก็จะส่งคืน $null มันไม่ส่งคืนข้อผิดพลาด

PowerShell มีตัวดำเนินการประเภทต่อไปนี้:

  • -is |ส่งคืน TRUE เมื่ออินพุตเป็นอินสแตนซ์ของประเภท .NET ที่ระบุ

    (get-date) -is [DateTime]     # Result is True
    
  • -isnot|ส่งคืน TRUE เมื่ออินพุตไม่ใช่อินสแตนซ์ของประเภท NET ที่ระบุ

    (get-date) -isnot [DateTime]  # Result is False
    
  • -as |แปลงอินพุตเป็นประเภท .NET ที่ระบุ

    "5/7/07" -as [DateTime]       # Result is Monday, May 7, 2007 12:00:00 AM
    

ไวยากรณ์ของตัวดำเนินการประเภทมีดังนี้:

<input> <operator> [.NET type]

คุณยังสามารถใช้ไวยากรณ์ต่อไปนี้:

<input> <operator> ".NET type"

ประเภท .NET สามารถเขียนเป็นชื่อประเภทในวงเล็บหรือสตริง เช่น [DateTime] หรือ "DateTime" สำหรับ System.DateTime . หากประเภทไม่ได้อยู่ที่รูทของเนมสเปซระบบ ให้ระบุชื่อเต็มของประเภทอ็อบเจ็กต์ คุณสามารถละเว้น "ระบบ" ได้ ตัวอย่างเช่น หากต้องการระบุ System.Diagnostics.Process ให้ป้อน [System.Diagnostics.Process], [Diagnostics.Process] หรือ "การวินิจฉัยกระบวนการ".

ตัวดำเนินการประเภทจะดำเนินการกับออบเจ็กต์อินพุตโดยรวมเสมอ นั่นคือ หากวัตถุอินพุตเป็นคอลเลกชัน จะเป็นประเภท คอลเลกชัน ที่ได้รับการทดสอบ ไม่ใช่ประเภทของ องค์ประกอบ ของคอลเลกชัน

-is/isnot ตัวดำเนินการ

ตัวดำเนินการประเภท บูลีน (-is และ -isnot) จะส่งกลับค่า บูลีน เสมอ แม้ว่าอินพุตจะเป็น คอลเลกชันของวัตถุ

ถ้า <input> เป็นประเภทที่เหมือนหรือ ได้รับมา จากประเภท .NET ตัวดำเนินการ -is จะส่งกลับ $จริง.

ตัวอย่างเช่น ประเภท DirectoryInfo ได้มาจากประเภท FileSystemInfo ดังนั้น ทั้งสองตัวอย่างนี้จึงส่งคืน True

PS> (Get-Item /) -is [System.IO.DirectoryInfo]
True
PS> (Get-Item /) -is [System.IO.FileSystemInfo]
True

ตัวดำเนินการ -is ยังสามารถจับคู่อินเทอร์เฟซได้ หาก <input> ใช้อินเทอร์เฟซในการเปรียบเทียบ ในตัวอย่างนี้ อินพุตเป็นอาร์เรย์ อาร์เรย์ใช้อินเทอร์เฟซ System.Collections.IList

PS> 1, 2 -is [System.Collections.IList]
True

- เป็นผู้ดำเนินการ

ตัวดำเนินการ -as พยายามแปลงวัตถุอินพุตเป็นประเภท .NET ที่ระบุ หากสำเร็จก็จะส่งคืนอ็อบเจ็กต์ที่แปลงแล้ว หากล้มเหลวจะส่งกลับ $null มันไม่ส่งคืนข้อผิดพลาด

หาก <input> เป็นประเภทที่ ได้รับมา จาก .NET Type -as ส่งผ่าน ส่งคืนอินพุต วัตถุไม่เปลี่ยนแปลง ตัวอย่างเช่น ประเภท DirectoryInfo ได้มาจากประเภท FileSystemInfo ดังนั้น ชนิดออบเจ็กต์จะไม่เปลี่ยนแปลงในตัวอย่างต่อไปนี้:

PS> $fsroot = (Get-Item /) -as [System.IO.FileSystemInfo]
PS> $fsroot.GetType().FullName
System.IO.DirectoryInfo

การแปลงประเภท DateTime จะขึ้นอยู่กับวัฒนธรรม

การแปลงเป็นประเภท [DateTime] โดยใช้ตัวดำเนินการ -as ใช้งานได้กับสตริงที่จัดรูปแบบตามกฎของวัฒนธรรมปัจจุบันเท่านั้น ซึ่งต่างจากการคัดเลือกประเภท

PS> [cultureinfo]::CurrentCulture = 'fr-FR'
PS> '13/5/20' -as [datetime]

mercredi 13 mai 2020 00:00:00

PS> '05/13/20' -as [datetime]
PS> [datetime]'05/13/20'

mercredi 13 mai 2020 00:00:00

PS> [datetime]'13/05/20'
InvalidArgument: Cannot convert value "13/05/20" to type "System.DateTime".
Error: "String '13/05/20' was not recognized as a valid DateTime."

หากต้องการค้นหาวัตถุประเภท .NET ให้ใช้ Get-Member cmdlet หรือใช้เมธอด GetType ของออบเจ็กต์ทั้งหมดร่วมกับคุณสมบัติ FullName ของเมธอดนี้ ตัวอย่างเช่น ข้อความต่อไปนี้ได้รับชนิดของค่าที่ส่งคืนของคำสั่ง Get-Culture:

PS> (Get-Culture).GetType().FullName
System.Globalization.CultureInfo

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงการใช้งานบางอย่างของตัวดำเนินการ Type:

PS> 32 -is [Float]
False

PS> 32 -is "int"
True

PS> (get-date) -is [DateTime]
True

PS> "12/31/2007" -is [DateTime]
False

PS> "12/31/2007" -is [String]
True

PS> (get-process PowerShell)[0] -is [System.Diagnostics.Process]
True

PS> (get-command get-member) -is [System.Management.Automation.CmdletInfo]
True

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเมื่ออินพุตเป็นคอลเลกชันของออบเจ็กต์ ประเภทการจับคู่จะเป็นประเภท .NET ของคอลเลกชัน ไม่ใช่ประเภทของแต่ละออบเจ็กต์ในคอลเลกชัน

ในตัวอย่างนี้ แม้ว่าทั้ง cmdlets Get-Culture และ Get-UICulture จะส่งกลับอ็อบเจ็กต์ System.Globalization.CultureInfo แต่คอลเลกชันของอ็อบเจ็กต์เหล่านี้ก็คือ อาร์เรย์ System.Object

PS> (get-culture) -is [System.Globalization.CultureInfo]
True

PS> (get-uiculture) -is [System.Globalization.CultureInfo]
True

PS> (get-culture), (get-uiculture) -is [System.Globalization.CultureInfo]
False

PS> (get-culture), (get-uiculture) -is [Array]
True

PS> (get-culture), (get-uiculture) | foreach {
  $_ -is [System.Globalization.CultureInfo])
}
True
True

PS> (get-culture), (get-uiculture) -is [Object]
True

ตัวอย่างต่อไปนี้แสดงวิธีการใช้ตัวดำเนินการ -as

PS> "12/31/07" -is [DateTime]
False

PS> "12/31/07" -as [DateTime]
Monday, December 31, 2007 12:00:00 AM

PS> $date = "12/31/07" -as [DateTime]

C:\PS>$a -is [DateTime]
True

PS> 1031 -as [System.Globalization.CultureInfo]

LCID      Name      DisplayName
----      ----      -----------
1031      de-DE     German (Germany)

ตัวอย่างต่อไปนี้แสดงให้เห็นว่าเมื่อตัวดำเนินการ -as ไม่สามารถแปลงออบเจ็กต์อินพุตเป็นประเภท .NET ได้ จะส่งคืน $null

PS> 1031 -as [System.Diagnostics.Process]
PS>

ดูเพิ่มเติม

  • about_Operators

บทความที่เกี่ยวข้อง