PowerShellの使い方(オブジェクト操作編)

#0. はじめに
前回の続きでオブジェクト操作周りのコマンドレットについて記載します。
前回と同じく、あまり丁寧には書いていません。

#1. 予備知識

正規表現や比較演算子のような他の言語などでも一般的な要素については知っている前提で進めます。あまり見たことのなかった文字列演算子に関しては簡単にメモしておきます。

|文字列演算子 | 説明 |
|:-----------|:-----|
|-like  | ワイルドカード比較(一致する場合、True)|
|-nolike  | ワイルドカード比較(一致しない場合、True)|
|-match  | 正規表現比較(一致する場合、True)|
|-nomatch  | 正規表現比較(一致しない場合、True)|

※ワイルドカード比較: ワイルドカード(*, ?, [])のみ使える

また、オブジェクト操作コマンドレットにはスクリプトブロック({}で囲まれた部分)というPowerShellのスクリプトが記載できるものがあります。その際、パイプラインで渡されたオブジェクトを指定するためのシェル変数($\_)が用意されており、このシェル変数を用いてオブジェクトを指定することができます。PowerShell v3以降ではこのスクリプトブロックを省略する簡易表記も可能になっています。
下記の例ではGet-Serviceで取得したオブジェクトが$\_に代入されています。

```ps1:スクリプトブロックと簡易表記
通常表記
PS> Get-Service | Where-Object {$_.DisplayName -match "^Windows*"}

簡易表記(PowerShell v3以降)
PS> Get-Service | Where-Object DisplayName -match "^Windows*"
```


#2. オブジェクト操作系コマンドレット

|コマンドレット | エイリアス | 説明 | TechNet | 記事内| 
|:-------------|:----------|:-----|:--------|:-----|
|Where-Object  | ?, where  |オブジェクトをフィルタ |[Link](http://technet.microsoft.com/ja-jp/library/dd347549.aspx) | [Link](#where-object)  |
|Select-Object  | select  |オブジェクトを選択 |[Link](http://technet.microsoft.com/ja-jp/library/dd347697.aspx) | [Link](#select-object)  |
|Sort-Object  | sort  |オブジェクトをソート |[Link](http://technet.microsoft.com/ja-jp/library/ee176968.aspx) | [Link](#sort-object)  |

##Where-Object
オブジェクトをフィルタするためのコマンドレットです。
下記の例ではDisplayNameがWindowsから始まるサービスを取得します。

```ps1:Where-Object
PS> Get-Service | Where-Object {$_.DisplayName -match "^Windows*"}

Status   Name               DisplayName
------   ----               -----------
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
Running  EventLog           Windows Event Log
Running  FontCache          Windows Font Cache Service
Stopped  FontCache3.0.0.0   Windows Presentation Foundation Fon...
Stopped  fussvc             Windows App Certification Kit Fast ...
(以下略)
```

##Select-Object
オブジェクトを選択するためのコマンドレットです。
下記の例ではサービスのステータスと表示名のみ出力します。

```ps1:Select-Object
PS> Get-Service | Select-Object Status, DisplayName

 Status DisplayName
 ------ -----------
Running Adobe Acrobat Update Service
Stopped Application Experience
Stopped Application Layer Gateway Service
Stopped Application Identity
Running Application Information
Stopped Application Management
(以下略)
```

パラメータで指定した順に出力されるの出力順番を入れ替えることもできます。

```ps1:Select-Object
PS> Get-Service | Select-Object DisplayName, Status

DisplayName                                                                                                      Status
-----------                                                                                                      ------
Adobe Acrobat Update Service                                                                                    Running
Application Experience                                                                                          Stopped
Application Layer Gateway Service                                                                               Stopped
Application Identity                                                                                            Stopped
Application Information                                                                                         Running
Application Management                                                                                          Stopped
(以下略)
```

また、-First, -Lastというパラメータを用いることでLinuxで言うところのhead, tailコマンドにパイプした時と同様の動作をさせることができます。

```ps1:
PS> Get-Service | Select-Object -First 3

Status   Name               DisplayName
------   ----               -----------
Running  AdobeARMservice    Adobe Acrobat Update Service
Stopped  AeLookupSvc        Application Experience
Stopped  ALG                Application Layer Gateway Service

PS> Get-Service | Select-Object -Last 3

Status   Name               DisplayName
------   ----               -----------
Running  wuauserv           Windows Update
Stopped  wudfsvc            Windows Driver Foundation - User-mo...
Stopped  WwanSvc            WWAN AutoConfig
```

##Sort-Object
オブジェクトをソートするためのコマンドレットです。
下記の例ではプロセスをHandles順にソート(昇順)しています。
※Get-ProcessはデフォルトではProcessName順

```ps1:Sort-Object
PS> Get-Process | Sort-Object Handles

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         24     0               0 Idle
     30       1      448        820     4     0.16    272 smss
     38       6      828       2528    40     0.02   1428 coherence
     51       5      980       2520    18     0.02   1344 coherence
     55       6     1180       3052    39     0.03   1416 coherence
     71       8     1148       3328    42     0.03   1220 armsvc
     81      10     1960       4344    57     0.17    412 wininit
     99       8     2060       5760    36     0.05   1584 dllhost
     99      12     1788       4608    50     0.08   1392 prl_tools_service
(以下略)
```

-Descendingパラメータを指定することで降順にソートすることができます。

```
PS> Get-Process | Sort-Object Handles -Descending

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
  45217      17     9244       9380    77     0.36   1264 dms_svc
   1166      56    23840      37060   497    17.46    936 svchost
    790      33    10152      17488    91     2.31    892 svchost
    721      73    24360      37896   281     4.51   2096 explorer
    718      25     4512      10280    45     1.97    512 lsass
    697      31    17716      12796   108     0.53   1180 SearchIndexer
    580      27    18944      19648   110     1.34    776 svchost
(以下略)
```

#3. おわりに
たった3つしか書いていませんが、オブジェクト操作系のコマンドレットはたくさんあります。特にCSVやJSONと言ったよく使われる形式からのインポートやオブジェクトへのコンバート、エクスポートなどデータの取り扱いの部分がしっかり整っていると感じました。機会があったらこの辺りもまとめてみたいと思います。
基本的な操作のまとめは終わって、サーバOS管理する上で便利そうなコマンドレットについてまとめようかと思っています。ただ、ansibleを触ってみたいという欲求強いのでそっちの記事にするかもしれません。