Select-Objectの使い方:オブジェクトのプロパティを選択する
Select-Object コマンドレットを使用すると、オブジェクトの指定したプロパティを取得したり、表示する項目を絞り込んだりすることができます。他のコマンドの実行結果として取得したオブジェクトをパイプを介して受け取り、必要なプロパティだけを取り出したい場合によく使用されます。ここでは PowerShell における Select-Object コマンドレットの使い方について解説します。
Select-Objectコマンドレットの書式
Select-Object コマンドレットは、オブジェクトの指定したプロパティを取得したり、表示する項目を絞り込んだりするためのコマンドレットです。 Select-Object コマンドレットの書式は次の通りです。
Select-Object [[-Property] <Object[]>] [-InputObject <PSObject>] [-ExcludeProperty <String[]>] [-ExpandProperty <String>] [-Unique] [-CaseInsensitive] [-Last <Int32>] [-First <Int32>] [-Skip <Int32>] [-Wait] [<CommonParameters>]
Select-Object はエイリアスとして select が定義されています。
select -> Select-Object
Select-Object を使ってオブジェクトの指定したプロパティを取得するには次の書式を使用します。
Select-Object -Property プロパティ名1, プロパティ名2, ...
-Property では、表示したいプロパティ名をカンマで区切って指定します。
-Property は省略可能なので、通常は次のように実行します。
Select-Object プロパティ名1, プロパティ名2, ...
対象となるオブジェクトは、パイプ(|)を使って Select-Object に渡します。
それでは実際に試してみます。次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object FullName, CreationTime, LastWriteTime
次のように画面に表示されました。
Get-ChildItem を使って指定したパスにあるファイルやディレクトリのオブジェクトを取得し、パイプを使って Select-Object へ渡し、指定した 3 つのプロパティだけが表示されていることが確認できます。
すべてのプロパティを取得する
プロパティとしてアスタリスク(*)を指定すると、すべてのプロパティを表示します。どのようなプロパティが存在するかを確認したい場合などに便利です。
次の例では特定のファイルを表すオブジェクトの、すべてのプロパティを取得しています。
Get-ChildItem c:\tmp\file\gadget.txt | Select-Object *
次のように、通常は表示されない詳細なプロパティも含めてすべて表示されました。
PS C:\code\powershell> Get-ChildItem c:\tmp\file\gadget.txt | Select-Object *
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\tmp\file\gadg
et.txt
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\tmp\file
PSChildName : gadget.txt
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
Mode : -a---
ModeWithoutHardLink : -a---
VersionInfo : File: C:\tmp\file\gadget.txt
InternalName:
OriginalFilename:
FileVersion:
FileDescription:
Product:
ProductVersion:
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language:
BaseName : gadget
ResolvedTarget : C:\tmp\file\gadget.txt
Target :
LinkType :
Name : gadget.txt
Length : 232
DirectoryName : C:\tmp\file
Directory : C:\tmp\file
IsReadOnly : False
Exists : True
FullName : C:\tmp\file\gadget.txt
Extension : .txt
CreationTime : 2026/04/19 5:14:28
CreationTimeUtc : 2026/04/18 20:14:28
LastAccessTime : 2026/04/27 19:51:08
LastAccessTimeUtc : 2026/04/27 10:51:08
LastWriteTime : 2026/04/25 8:59:54
LastWriteTimeUtc : 2026/04/24 23:59:54
LinkTarget :
UnixFileMode : -1
Attributes : Archive
ただし、すべてのプロパティを表示すると情報量が多くなり見づらくなるため、通常は必要なプロパティだけを指定して取得するのが一般的です。
表示する件数を制限する
Select-Object では表示する件数を制限するためのオプションがいくつか用意されています。最初に制限をしなかった場合にどのように取得するのかを確認します。次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object FullName
実行結果は次のようになります。
PS C:\code\powershell> Get-ChildItem c:\tmp\file | Select-Object FullName FullName -------- C:\tmp\file\access.back C:\tmp\file\access.log C:\tmp\file\address.txt C:\tmp\file\furniture.txt C:\tmp\file\gadget.txt C:\tmp\file\profile.txt C:\tmp\file\test.ps1
それでは用意されているオプションを試していきます。
-Firstオプション
-First オプションを使用すると、先頭から数えていくつのオブジェクトをパイプを介して渡すのかを制限できます。
Select-Object プロパティ名1, プロパティ名2, ... -First 個数
例えば個数に 5 を指定すると、先頭から 5 つのオブジェクトだけをパイプを介して Select-Object に渡します。
それでは次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object FullName -First 3
実行結果は次のようになります。
PS C:\code\powershell> Get-ChildItem c:\tmp\file | Select-Object FullName -First 3 FullName -------- C:\tmp\file\access.back C:\tmp\file\access.log C:\tmp\file\address.txt
先頭から 3 つのオブジェクトだけを取得しています。
-Lastオプション
-Last オプションを使用すると、末尾から数えていくつのオブジェクトをパイプを介して渡すのかを制限できます。
Select-Object プロパティ名1, プロパティ名2, ... -Last 個数
例えば個数に 4 を指定すると、末尾から 4 つのオブジェクトだけをパイプを介して Select-Object に渡します。
それでは次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object FullName -Last 3
実行結果は次のようになります。
PS C:\code\powershell> Get-ChildItem c:\tmp\file | Select-Object FullName -Last 3 FullName -------- C:\tmp\file\gadget.txt C:\tmp\file\profile.txt C:\tmp\file\test.ps1
末尾から 3 つのオブジェクトだけを取得しています。
-Skipオプション
-Skip オプションを使用すると、指定した数のオブジェクトを先頭スキップして、それ以降のオブジェクトだけをパイプを介して渡します。
Select-Object プロパティ名1, プロパティ名2, ... -Skip 個数
例えば個数に 4 を指定すると、先頭から指定した数のオブジェクトを除外し、それ以降のオブジェクトを取得します。
それでは次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object FullName -Skip 3
実行結果は次のようになります。
PS C:\code\powershell> Get-ChildItem c:\tmp\file | Select-Object FullName -Skip 3 FullName -------- C:\tmp\file\furniture.txt C:\tmp\file\gadget.txt C:\tmp\file\profile.txt C:\tmp\file\test.ps1
先頭から数えて 4 つ目以降のオブジェクトだけを取得しています。
-SkipLastオプション
-SkipLast オプションを使用すると、指定した数のオブジェクトを末尾からスキップします。それ以外のオブジェクトだけをパイプを介して渡します。(このオプションは PowerShell 7.4 以降で使用できます)。
Select-Object プロパティ名1, プロパティ名2, ... -SkipLast 個数
例えば個数に 4 を指定すると、末尾から指定した数のオブジェクトを除外し、それ以外のオブジェクトを取得します。
それでは次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object FullName -SkipLast 3
実行結果は次のようになります。
PS C:\code\powershell> Get-ChildItem c:\tmp\file | Select-Object FullName -SkipLast 3 FullName -------- C:\tmp\file\access.back C:\tmp\file\access.log C:\tmp\file\address.txt C:\tmp\file\furniture.txt
末尾から数えて 4 つのオブジェクト以外のオブジェクトだけを取得しています。
-Indexオプション
-Index オプションを使用すると、指定したインデックスのオブジェクトだけをパイプを介して渡します。インデックスは先頭のオブジェクトが 0 で、複数のインデックスを指定する場合はカンマ(,)で区切って指定します。
Select-Object -Index インデックス1, インデックス2, ...
※ -Index はオブジェクトの位置で抽出するため、-Property のようなプロパティ選択とは併用できません。
例えばインデックスに 1 を指定すると、先頭から数えて 2 番目のオブジェクトだけをパイプを介して Select-Object に渡します。
それでは次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object -Index 1, 3 | Select-Object FullName
実行結果は次のようになります。
PS C:\code\powershell> Get-ChildItem c:\tmp\file | Select-Object -Index 1, 3 | Select-Object FullName FullName -------- C:\tmp\file\access.log C:\tmp\file\furniture.txt
先頭から数えて 2 番目と 4 番目のオブジェクトだけを取得し、さらにパイプを介して特定のプロパティだけを取得しています。
重複するプロパティを除外する
-Unique オプションを使用すると、Select-Object で取得した結果の中で、同じ内容のものが複数ある場合に、一つだけを残して重複を除外できます。
Select-Object プロパティ名1, プロパティ名2, ... -Unique
それでは実際に試してみます。最初に -Unique オプションを付けずに、次のようにコマンドを実行してください。
Get-Process | Select-Object Name
実行した結果を見ると、次のように同じ内容のオブジェクトが含まれています。
次に -Unique オプションを付けて、次のようにコマンドを実行してください。
Get-Process | Select-Object Name -Unique
実行した結果を見ると、同じ内容のオブジェクトが一つを残して除外されていることが確認できます。
なお、-Unique は、Select-Object で取得した結果全体を比較して重複を判定します。
プロパティの値だけを取得する
Select-Object では通常、指定したプロパティを持つオブジェクトを取得しますが、 -ExpandProperty オプションを使用すると、プロパティの値だけを直接取得できます。
Select-Object -ExpandProperty プロパティ名
※ 指定できるプロパティは一つだけです。
それでは実際に試してみます。最初に -ExpandProperty オプションを使用せずに、次のように実行してください。
Get-ChildItem c:\tmp\file | Select-Object Name
実行結果は次のようになります。
この場合、 Name プロパティを持つオブジェクトとして取得しています。
次に -ExpandProperty オプションを使用して、同じプロパティを取得してみます。
Get-ChildItem c:\tmp\file | Select-Object -ExpandProperty Name
実行結果は次のようになります。
今回は Name プロパティを持つオブジェクトではなく、 Name プロパティの値そのものを取得しています。
例えば取得した値をそのまま文字列として処理したい場合や、他のコマンドへ単純な値として渡したい場合に便利です。
配列の要素を展開して取得する
-ExpandProperty オプションで指定したプロパティが配列だった場合は、配列の要素を展開して取得します。
例として Get-Command を使って、 Get-Item コマンドの OutputType プロパティの値を取得してみます。次のように実行してください。
Get-Command Get-Item | Select-Object OutputType
実行結果は次のようになります。
PS C:\code\powershell> Get-Command Get-Item | Select-Object OutputType
OutputType
----------
{System.IO.FileInfo, System.Boolean, System.String, System.IO.FileInfo…}
OutputType プロパティには配列が格納されており、複数の値がまとめて表示されています。
-ExpandProperty オプションで配列の値を持つプロパティを指定すると、配列の各要素を 1 つずつ取得することができます。次のように実行してください。
Get-Command Get-Item | Select-Object -ExpandProperty OutputType
実行結果は次のようになります。
PS C:\code\powershell> Get-Command Get-Item | Select-Object -ExpandProperty OutputType Name Type TypeDefinitionAst ---- ---- ----------------- System.IO.FileInfo System.IO.FileInfo System.Boolean System.Boolean System.String System.String System.IO.FileInfo System.IO.FileInfo System.IO.DirectoryInfo System.IO.DirectoryInfo
配列の各要素が 1 件ずつ展開されて表示されました。
-- --
PowerShell における Select-Object コマンドレットの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。