PowerShellの調べ方

# はじめに
PowerShellをちょこちょこと書くようになって、[www.python.orgのようにライブラリリファレンスとかチュートリアルがまとまっているページ](https://www.python.org/doc/)が無いなぁ（あるのかもしれないけど、いまいち情報が探しにくい）と思うようになったので、特によく見るものをまとめることに。
最近のMicrosoftのドキュメントはURLにもこだわりが見られるので、基本ドキュメント内にリンクを張っておくけどURLもべた書きしておく。

情報は2017/12/03時点のもので、更新されて古い情報になってることがあるかもしれないのでご留意のほど。

# 調べ方 
はじめに抑えておくべきは、PowerShellはPowerShellのドキュメントだけ調べてもダメ、ということ。もう少し詳しく書くと、どうも、以下の構成要素を理解する必要がありそう。当然、各構成要素ごとに参照するドキュメントが異なるのだが、そのことを分かっているだけで飛躍的に調べやすくなる。
僕がスクリプト書く都合でPowerShellのバージョンは5（5.1）で纏めている[^about-version]。欲しいバージョンに応じて読み替えること。


| 構成要素       |概要 |
|:-----------------|:------------------|
| PowerShell       | PowerShell自体。 |
| .NET Framework   | PowerShellは（LinuxのShellScrptがコマンドを利用しているように）.NETを利用しており、.NETのAPIを呼んだりする。 |
| WMF              | Windows Management Framework。Windowsの管理用フレームワーク（直訳）だが、PowerShellをWindowsの管理目的で利用することを考えるとWMFを意識しておく必要がある。 |


## PowerShell
### PowerShell Documentation
基本的には、[Microsoft Docs](https://docs.microsoft.com/ja-jp/)の [PowerShell Documentation](https://docs.microsoft.com/ja-jp/powershell/)がオフィシャルなリファレンスっぽい。

- https://docs.microsoft.com/ja-jp/
- https://docs.microsoft.com/ja-jp/powershell/

### Reference（PowerShell Documentation内）
PowerShell Documentationのページから[Reference](https://docs.microsoft.com/ja-jp/powershell/scripting/powershell-scripting?view=powershell-5.1)に進むと、バージョンごとの新機能やコンソールコマンドライン（いつものPowerShellのコンソール）のリファレンスが提供されている。ここで要注意なのが、**サイトの表示言語を「日本語」にしていると肝心要のリファレンスが表示されない**ということ[^update-01]。
英語で表示するとこんな感じに"[> Reference](https://docs.microsoft.com/en-us/powershell/scripting/powershell-scripting?view=powershell-5.1)"が表示される。

Cmdletの利用方法基本的にここから確認できる。`Get-Service`の場合は、[こんな感じ](https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-Service?view=powershell-5.1)で引数の種類（ParameterSet）や引数の意味、実行例などが書かれている。

- https://docs.microsoft.com/en-us/powershell/scripting/powershell-scripting?view=powershell-5.1
- https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-Service?view=powershell-5.1

### Aboutちょめちょめ（PowerShell Documentation内）
PowerShellの言語仕様、たとえばエイリアス、Preference系変数などなどは、`Get-Help about_Preference_Variables`みたいにGet-Helpでも確認できる。この情報は、[ReferenceのMicrosoft.PowerShell.Core](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/?view=powershell-5.1)の"About"内にある。

- https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/?view=powershell-5.1

僕がよく見るもの、見そうなものを並べておく。

- **about_Arrays**
    - 配列の書き方。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_arrays?view=powershell-5.1
- **about_Automatic_Variables**
    - PowerShellの状態が格納される変数。たとえば`$_`、`$ERROR`、`$PSVERSIONTABLE`。環境変数とかリターンコードに近い。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_automatic_variables?view=powershell-5.1
- **about_Eventlogs**
    - イベントログの操作。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_eventlogs?view=powershell-5.1
- **about_Functions_Advanced**
    - 高度な関数。`[CmdletBinding()]`のやつ。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced?view=powershell-5.1
- **about_Functions_Advanced_Parameters**
    - 高度な関数における、パラメータの扱い。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_parameters?view=powershell-5.1
- **about_Hash_Tables**
    - ハッシュテーブルの書き方。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_hash_tables?view=powershell-5.1
- **about_Modules**
    - モジュールについて。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_modules?view=powershell-5.1
- **about_Preference_Variables**
    - Preference変数について。`$ErrorActionPreference`など。デフォルト値も書いてある。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_preference_variables?view=powershell-5.1
- **about_Profiles**
    - プロファイルについて。
    - https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-5.1

## PowerShell自体についてるもの
### Get-Help
書いているときに、一番手軽に参照する方法。

```text:Get-Help
PS C:\Users\bounoki> Get-Help Get-Service
```

## .NET Framework
PowerShellは.NET Frameworkで動いている以上に、PowerShellのスクリプト内で.NET Frameworkを触れたりする。動かしている.NET Frameworkのバージョンに注意してドキュメントを調べる必要がある。
WMFのバージョンも合わせて、[PowerShellのシステム要件（PowerShell Documentationのセットアップ内）](https://docs.microsoft.com/ja-jp/powershell/scripting/setup/windows-powershell-system-requirements?view=powershell-5.1)に書かれている。


### MSDN
MSDN(Microsoft Developpers Network)は、いつでもMicrosoft環境での開発において立ち返る場所である（確信）。
僕はWMF5.1をインストールしていて、「WMF 5.1 には .NET Framework 4.5.2 (またはそれ以上) が必要」であると[書かれている](https://docs.microsoft.com/ja-jp/powershell/wmf/5.1/install-configure)ので、ここでは.NET Frameworkのリファレンスは[.NET Framework 4.6 および 4.5](https://msdn.microsoft.com/ja-jp/library/w0x726c2(v=vs.110).aspx)を参照している。

### .NET Framework クラスライブラリ
[.NET Frameworkクラスライブラリ](https://msdn.microsoft.com/ja-jp/library/mt472912(v=vs.110).aspx)を、C#で開発する際と同じように参照するだけ。

たとえば、`Get-Service`で取れるオブジェクトは、

```text:ServiceController
PS C:\Users\bounoki> $svc = (Get-Service dhcp)
PS C:\Users\bounoki> $svc.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    ServiceController                        System.ComponentModel.Component 
```
のように`ServiceController`であること、`BaseType`が`System.ComponentModel.Component`であることが分かる。[`System.ComponentModel.Component`をクラスライブラリのリファレンスで見てみると](https://msdn.microsoft.com/ja-jp/library/system.componentmodel.component(v=vs.110).aspx)、`System.ServiceProcess.ServiceController`が見つかる。
[さらに`System.ServiceProcess.ServiceController`のリファレンスを見ると](https://msdn.microsoft.com/ja-jp/library/system.serviceprocess.servicecontroller(v=vs.110).aspx)、たとえばサービスの表示名（`DisplayNameプロパティ`）なんかが取れそう。

試す。

```text:ServiceController（続き）

PS C:\Users\bounoki> $svc.DisplayName
DHCP Client
PS C:\Users\bounoki> $svc.StartType
Automatic
```

## WMF

そのうち調べる。


[^about-version]: PowerShell 5.1というのが何者なのか、よくわからない。というのも、PowerShell Documentationで5.1を選択しても、5.0のものが表示される。恐らく、WMF5.1に対応するPowerShell5なのでは、と思っているが、詳しく調べる必要がありそう。
[^update-01]: 最近、日本語表示でも`reference`が表示されるようになったみたい。