web-dev-qa-db-ja.com

PowerShellで使用されるGetType、変数間の違い

変数$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

しかし、これらの変数の出力は異なって見えますが、違いはないようです。

64
jrara

まず、GetTypeを呼び出すための括弧がありません。表示されるのは、[DayOfWeek]のGetTypeメソッドを記述するMethodInfoです。実際にGetTypeを呼び出すには、次のことを行う必要があります。

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

$aは[DayOfWeek]であり、$bSelect-Object コマンドレットによって生成され、データオブジェクトのDayOfWeekプロパティのみをキャプチャするカスタムオブジェクトであることがわかります。したがって、DayOfWeekプロパティのみを持つオブジェクトです。

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

Select-Objectは新しいpsobjectを作成し、要求したプロパティをコピーします。 GetType()でこれを確認できます:

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

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

Select-Object は、カスタムを返します PSObject プロパティのみを指定します。単一のプロパティであっても、ACTUAL変数を取得しません。 PSObject内にラップされます。

代わりに:

Get-Date | Select-Object -ExpandProperty DayOfWeek

それはあなたと同じ結果を得るでしょう:

(Get-Date).DayOfWeek

違いは、 Get-Date が複数のオブジェクトを返す場合、たとえば (Get-ChildItem) がアイテムの配列であるため、パイプラインの方法は括弧の方法よりも優れていることです。これはPowerShell v3で変更され、(Get-ChildItem).FullPathは期待どおりに機能し、完全なパスのみの配列を返します。

8