サーチ…


オブジェクトの更新

プロパティの追加

既存のオブジェクトにプロパティを追加する場合は、Add-Memberコマンドレットを使用できます。 PSObjectsでは、値は「ノートプロパティ」のタイプで保持されます。

$object = New-Object -TypeName PSObject -Property @{
        Name = $env:username
        ID = 12
        Address = $null
    }

Add-Member -InputObject $object -Name "SomeNewProp" -Value "A value" -MemberType NoteProperty

# Returns
PS> $Object
Name ID Address SomeNewProp
---- -- ------- -----------
nem  12         A value

Select-Objectコマンドレット(いわゆる計算されたプロパティ)でプロパティを追加することもできます。

$newObject = $Object | Select-Object *, @{label='SomeOtherProp'; expression={'Another value'}}

# Returns
PS> $newObject
Name ID Address SomeNewProp SomeOtherProp
---- -- ------- ----------- -------------
nem  12         A value     Another value

上記のコマンドは以下のように短縮できます:

$newObject = $Object | Select *,@{l='SomeOtherProp';e={'Another value'}}

プロパティの削除

Select-Objectコマンドレットを使用して、オブジェクトからプロパティを削除できます。

$object = $newObject | Select-Object * -ExcludeProperty ID, Address

# Returns
PS> $object
Name SomeNewProp SomeOtherProp
---- ----------- -------------
nem  A value     Another value

新しいオブジェクトを作成する

PowerShellは、他のスクリプト言語とは異なり、オブジェクトをパイプライン経由で送信します。つまり、あるコマンドから別のコマンドにデータを送信する場合、オブジェクトの作成、変更、および収集が不可欠です。

オブジェクトの作成は簡単です。作成するほとんどのオブジェクトはPowerShellのカスタムオブジェクトになり、そのオブジェクトに使用する型はPSObjectです。 PowerShellでは、.NETで作成できるオブジェクトを作成することもできます。

次に、いくつかのプロパティを持つ新しいオブジェクトを作成する例を示します。

オプション1:新規オブジェクト

$newObject = New-Object -TypeName PSObject -Property @{
    Name = $env:username
    ID = 12
    Address = $null
}

# Returns
PS> $newObject
Name ID Address
---- -- -------
nem  12

変数にオブジェクトを格納するには、コマンドの前に$newObject =

また、オブジェクトのコレクションを格納する必要があります。これは、空のコレクション変数を作成し、コレクションにオブジェクトを追加することによって行うことができます。

$newCollection = @()
$newCollection += New-Object -TypeName PSObject -Property @{
    Name = $env:username
    ID = 12
    Address = $null
}

このコレクションオブジェクトをオブジェクトごとに反復処理することができます。これを行うには、ドキュメントの「Loop」セクションを探します。

オプション2:Select-Object

あまり一般的でない方法でインターネット上で見つかるオブジェクトを作成する方法は次のとおりです。

$newObject = 'unuseddummy' | Select-Object -Property Name, ID, Address
$newObject.Name = $env:username
$newObject.ID = 12

# Returns
PS> $newObject
Name ID Address
---- -- -------
nem  12

オプション3:pscustomobjectタイプアクセラレータ(PSv3 +必須)

順序付けされた型のアクセラレータは、PowerShellが定義した順序でプロパティを保持するように強制します。 [PSCustomObject]を使用するために、順序付きアクセラレータは必要ありません。

$newObject = [PSCustomObject][Ordered]@{
    Name = $env:Username
    ID = 12
    Address = $null
}

# Returns
PS> $newObject
Name ID Address
---- -- -------
nem  12

オブジェクトを調べる

オブジェクトがあるので、それが何であるか把握すると良いかもしれません。 Get-Memberコマンドレットを使用して、オブジェクトの内容とオブジェクトの内容を確認できます。

Get-Item c:\windows | Get-Member

これにより、

TypeName: System.IO.DirectoryInfo

オブジェクトにはプロパティとメソッドのリストが続きます。

オブジェクトの型を取得する別の方法は、次のようにGetTypeメソッドを使用することです。

C:\> $Object = Get-Item C:\Windows
C:\> $Object.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DirectoryInfo                            System.IO.FileSystemInfo

オブジェクトが持つプロパティのリストを表示するには、その値とともにFormat-Listコマンドレットを使用して、プロパティパラメータに*(すべてを意味する)を設定します。

結果は次のようになります。

C:\> Get-Item C:\Windows | Format-List -Property *


PSPath            : Microsoft.PowerShell.Core\FileSystem::C:\Windows
PSParentPath      : Microsoft.PowerShell.Core\FileSystem::C:\
PSChildName       : Windows
PSDrive           : C
PSProvider        : Microsoft.PowerShell.Core\FileSystem
PSIsContainer     : True
Mode              : d-----
BaseName          : Windows
Target            : {}
LinkType          :
Name              : Windows
Parent            :
Exists            : True
Root              : C:\
FullName          : C:\Windows
Extension         :
CreationTime      : 30/10/2015 06:28:30
CreationTimeUtc   : 30/10/2015 06:28:30
LastAccessTime    : 16/08/2016 17:32:04
LastAccessTimeUtc : 16/08/2016 16:32:04
LastWriteTime     : 16/08/2016 17:32:04
LastWriteTimeUtc  : 16/08/2016 16:32:04
Attributes        : Directory

汎用クラスのインスタンスの作成

注:PowerShell 5.1で書かれた例Generic Classesのインスタンスを作成することができます

#Nullable System.DateTime
[Nullable[datetime]]$nullableDate = Get-Date -Year 2012
$nullableDate
$nullableDate.GetType().FullName
$nullableDate = $null
$nullableDate

#Normal System.DateTime
[datetime]$aDate = Get-Date -Year 2013
$aDate
$aDate.GetType().FullName
$aDate = $null #Throws exception when PowerShell attempts to convert null to 

出力を与える:

Saturday, 4 August 2012 08:53:02
System.DateTime
Sunday, 4 August 2013 08:53:02
System.DateTime
Cannot convert null to type "System.DateTime".
At line:14 char:1
+ $aDate = $null
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullyQualifiedErrorId : RuntimeException

一般的なコレクションも可能です

[System.Collections.Generic.SortedDictionary[int, String]]$dict = [System.Collections.Generic.SortedDictionary[int, String]]::new()
$dict.GetType().FullName

$dict.Add(1, 'a')
$dict.Add(2, 'b')
$dict.Add(3, 'c')


$dict.Add('4', 'd') #powershell auto converts '4' to 4
$dict.Add('5.1', 'c') #powershell auto converts '5.1' to 5

$dict

$dict.Add('z', 'z') #powershell can't convert 'z' to System.Int32 so it throws an error

出力を与える:

System.Collections.Generic.SortedDictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

Key Value
--- -----
  1 a
  2 b
  3 c
  4 d
  5 c
Cannot convert argument "key", with value: "z", for "Add" to type "System.Int32": "Cannot convert value "z" to type "System.Int32". Error: "Input string was not in a correct format.""
At line:15 char:1
+ $dict.Add('z', 'z') #powershell can't convert 'z' to System.Int32 so  ...
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow