GetType digunakan di PowerShell, perbedaan antar variabel

92

Apa perbedaan antara Variabel $adan $b?

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

Saya mencoba untuk memeriksa

$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

Namun tampaknya tidak ada perbedaan meskipun keluaran dari variabel-variabel tersebut terlihat berbeda.

jrara
sumber

Jawaban:

163

Pertama-tama, Anda tidak memiliki tanda kurung untuk memanggil GetType. Apa yang Anda lihat adalah MethodInfo yang menjelaskan metode GetType pada [DayOfWeek]. Untuk benar-benar memanggil GetType, Anda harus melakukan:

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

Anda akan melihat bahwa itu $aadalah [DayOfWeek], dan $bmerupakan objek kustom yang dibuat oleh cmdlet Select-Object untuk menangkap hanya properti DayOfWeek dari objek data. Karenanya, ini adalah objek dengan properti DayOfWeek saja:

C:\> $b.DayOfWeek -eq $a
True
Cédric Rup
sumber
20

Select-Object membuat psobject baru dan menyalin properti yang Anda minta. Anda dapat memverifikasi ini dengan GetType ():

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

PS > $b.GetType().fullname
System.Management.Automation.PSCustomObject
Shay Levy
sumber
10

Select-Object mengembalikan PSObject kustom hanya dengan properti yang ditentukan. Bahkan dengan satu properti, Anda tidak mendapatkan variabel AKTUAL; itu dibungkus di dalam PSObject.

Sebaliknya, lakukan:

Get-Date | Select-Object -ExpandProperty DayOfWeek

Itu akan memberi Anda hasil yang sama seperti:

(Get-Date).DayOfWeek

Perbedaannya adalah jika Get-Date mengembalikan beberapa objek, cara pipeline berfungsi lebih baik daripada cara tanda kurung karena (Get-ChildItem), misalnya, adalah array item. Ini telah berubah di PowerShell v3 dan (Get-ChildItem).FullPathberfungsi seperti yang diharapkan dan mengembalikan larik hanya jalur lengkap.

MasterCheffinator
sumber