3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerShell 7 覚書き

Last updated at Posted at 2020-09-24

PowerShell 7の覚書きです。

PSCustomObjectからキーと名前を取得する。

PSCustomObjectは非表示のプロパティPSObjectPSObject型)を持ちます。これのPropertiesプロパティを使用してPSCustomObjectのキーと名前(NameValue)の配列を取得できます。

$obj = [PSCustomObject]@{a=0; b=1; c=2}
$obj = ($obj.PSObject.Properties | Select-Object -Property Name, Value)
$obj.GetType()
# IsPublic IsSerial Name                                     BaseType
# -------- -------- ----                                     --------
# True     True     Object[]                                 System.Array
$obj | Format-Table
# Name Value
# ---- -----
# a        0
# b        1
# c        2

補足

PSCustomObjectクラスのPSObjectプロパティとPSObject.Propertiesは次の形式です。

$props = [PSCustomObject]@{a=0; b=1; c=2}

$props.PSObject
# BaseObject          :
# Members             : {int a=0, int b=1, int c=2, ToString…}
# Properties          : {int a=0, int b=1, int c=2}
# Methods             : {ToString, GetType, Equals, GetHashCode}
# ImmediateBaseObject :
# TypeNames           : {System.Management.Automation.PSCustomObject, System.Object}

$props.PSObject.Properties
# Value           : 0
# MemberType      : NoteProperty
# IsSettable      : True
# IsGettable      : True
# TypeNameOfValue : System.Int32
# Name            : a
# IsInstance      : True
# 
# Value           : 1
# MemberType      : NoteProperty
# IsSettable      : True
# IsGettable      : True
# TypeNameOfValue : System.Int32
# Name            : b
# IsInstance      : True
# 
# Value           : 2
# MemberType      : NoteProperty
# IsSettable      : True
# IsGettable      : True
# TypeNameOfValue : System.Int32
# Name            : c
# IsInstance      : True

参考

PSCustomObjectのパイプラインで渡されるオブジェクトは元のPSCustomObject

PSCustomObjectをパイプライン演算子|で次の関数に渡したとき、関数は元のPSCustomObjectそのものを受け取ります。したがって、キーと値ペアの配列を扱いたいときはPSObject非表示プロパティを介します。

$obj = [PSCustomObject]@{a=0; b=1; c=2}
$obj | Select-Object {$_}
# $_
# --
# @{a=0; b=1; c=2}

$obj | Select-Object {$_.GetType()}
# $_.GetType()
# ------------
# System.Management.Automation.PSCustomObject

配列に型を指定する。

かっこ付きのカンマ演算子による配列作成(a, b, ...)または配列部分式演算子@(a, b, ...)の前にキャスト[type[]]を指定することで配列に型を指定できます。

$Array1 = [int[]](0, 1, 2)
#$Array1 = [int[]]@(0, 1, 2)
$Array1
# 0
# 1
# 2
$Array1.GetType().Name
# Int32[]

かっこを省略した場合は挙動が変わることに注意してください。

$Array1 = [int[]]0, 1, 2
$Array1
# Length         : 1
# LongLength     : 1
# Rank           : 1
# SyncRoot       : {0}
# IsReadOnly     : False
# IsFixedSize    : True
# IsSynchronized : False
# Count          : 1
# 
# 1
# 2
$Array1.GetType().Name
# Object[]
$Array1 = [int[]], 0, 1, 2
$Array1
# IsPublic IsSerial Name                                     BaseType
# -------- -------- ----                                     --------
# True     True     Int32[]                                  System.Array
# 0
# 1
# 2
$Array1.GetType().Name
# Object[]

連番の場合は..も使えます。

$Array1 = [int[]](0..2)

Select-Objectでスクリプトブロックを与えたときの結果に名前を付ける

Select-Objectにスクリプトブロック{...}を渡すとCalculated propertyが得られます。Calculated propertyは列名が式そのものとなり複雑です。

#0..3 | Select-Object {$_ + 1}
# $_ + 1
# ------
# 1
# 2
# 3
# 4

Select-Objectlabelまたはlキーに名前、expressionまたはeにスクリプトブロックを持つハッシュテーブルを渡すと名前を指定してスクリプトブロックの結果を取得できます。

0..3 | Select-Object @{l="Value"; e={$_ + 1}}
# Value
# -----
#     1
#     2
#     3
#     4

配列への変換も簡単です。

(0..3 | Select-Object @{l="Value"; e={$_ + 1}}).Value
# 1
# 2
# 3
# 4

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?