Powershellで分からないコマンドはPowershellで調べる

# PowershellのことはPowershellで済ませてみる

Powershellを使っていて、コマンドレットを忘れてしまったり、どんなコマンドレットがあるか調べたいと思うことがある。そういうときは、ネットで調べるのもいいが、Powershellの機能を使って調べることもできる。

PowershellのことをPowershellで調べるには、以下のような方法が役に立つ。

* 入力補完
* コマンドレットの検索
* ヘルプの利用

# 入力補完
調べるというと語弊があるかもしれないが、Powershellには、途中まで入力したコマンドレットを補完する機能がある。Linuxのシェルと同様の機能だ。

* コマンドレットを途中まで入力して **Tab** を入力
* コマンドレットを途中まで入力して **Ctrl + Space** を入力

この機能を使えば、コマンドレットを入力するスピードを上げたり、綴りまで正確におぼえなくてもコマンドレットを入力できるようになる。補完の機能は、コマンドやオプションの入力、ファイルパス、定数の選択に使用できる。

コマンドレットを途中まで入力して **Tab** を入力すると、途中まで入力したコマンドが補完される。さらに **Tab** を押すと、別の候補が表示される。表示した候補を戻りたいときは、**Shift + Tab** を押す。

```powershell
PS C:\Users\Main> Get-help Get-Chil       #ここまで入力してTabを入力
PS C:\Users\Main> Get-help Get-ChildItem　#コマンドが補完される
```

**Ctrl + Space** で行う補完は、補完の候補が全て表示され、矢印キーで候補を選択することができる。オプションの補完を行った場合、一番下にオプションの形式や指定できる値等の情報が表示される。

```powershell
PS > Get-Net                       #ここまで入力してCtrl + Spaceを入力
PS > Get-Net6to4Configuration      #コマンドの候補が表示され選択できる
Get-Net6to4Configuration                     Get-NetIPAddress
Get-NetAdapter                               Get-NetIPConfiguration
・・・・・・・

PS > Get-ChildItem -　　　　# ここまで入力してCtrl + Spaceを入力
PS > Get-ChildItem -Path   # オプションの候補が表示されて選択することができる。
Path                 Depth                File                 ErrorAction          OutVariable
LiteralPath          Force                Hidden               WarningAction        

[string[]] Path    # さらに一番下に、オプションで指定できる値等の情報が表示される
```
                                                       
# コマンドレットの検索
**Get-Command** を使うとコマンドレットが検索できる。**Get-Command** のパラメータにコマンドレット名を入れると、コマンドレットの名前が表示される。

```powershell
PS> get-command Get-ChildItem

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-ChildItem                                      3.1.0.0    Microsoft.PowerShell.Management
```

この出力だけ見ると、何の役に立つコマンドレットか全く理解できない。**Get-Commmand**のパラメータには、*(ワイルドカード)が指定できる。*を指定することで、コマンドレットを検索することができる。

```Powershell
PS > get-command Get-C*dItem

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-ChildItem                                      3.1.0.0    Microsoft.PowerShell.Management
```

Powershell のコマンドレットは、<動詞>-<名詞> という構造になっている。**Get-Command**　で、**-Noun** を指定すれば名詞部分、**-Verb** を指定すれば、動詞部分を指定して検索できる。公開されているモジュールのコマンドレットでは、名詞部分の頭にモジュールを判別できるような文字列を付けていることが多い。名前からでもコマンドレットが調べられるように工夫されている。

```Powershell
# 名前で検索する場合
PS > Get-Command -Noun Item

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Clear-Item                                         3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Copy-Item                                          3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Get-Item                                           3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Invoke-Item                                        3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Move-Item                                          3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          New-Item                                           3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Remove-Item                                        3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Rename-Item                                        3.1.0.0    Microsoft.PowerShell.Management
Cmdlet          Set-Item                                           3.1.0.0    Microsoft.PowerShell.Management

# 動詞部分も併せて絞り込む
PS > Get-Command -Noun Item -Verb Get

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-Item                                           3.1.0.0    Microsoft.PowerShell.Management

```

**-Module** でモジュールを指定すれば、モジュールで提供されているコマンドレットを確認することができる。これにより、ネットで情報の少ないようなモジュールでも、どのようなコマンドが提供されているかを知ることができる。

```Powershell
# Selenium のモジュールをインストールした後に使えるコマンドレットを調べる。
> Get-Command -Module Selenium

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           Enter-SeUrl                                        3.0.1      Selenium
Alias           Find-SeElement                                     3.0.1      Selenium
Alias           Start-SeLegacyEdge                                 3.0.1      Selenium
Function        Clear-SeAlert                                      3.0.1      Selenium
Function        Get-SeCookie                                       3.0.1      Selenium
.......

```
# コマンドレットの情報を調べる
コマンドレットの情報は **Get-Help** で調べることができる。もしくは、コマンドレットに　**-?** のパラメータを付けると、コマンドレットの情報を調べる事ができる。ただし英語だ。

コマンドレットのパラメータ **-Detailed** や **-Full** を使うと、表示させる情報量や内容を指定することができる。

```powershell
PS C:\Users\Main> Get-help Get-ChildItem -Parameter * #全てのパラメータの情報を表示する

-Attributes <System.Management.Automation.FlagsExpression`1[System.IO.FileAttributes]>
    {{Fill Attributes Description}}

    必須                         false
    位置                         named
    既定値                       None
    パイプライン入力を許可する   False
    ワイルドカード文字を許可する false


-Depth <UInt32>
    {{Fill Depth Description}}
・
・
・
```

英語ができる人なら、非常に便利な機能だろう。日本語がメインの人であれば、正直ネットで調べた方が早い。使用例の参照であれば、見ているだけで何となく使い方をイメージすることができる。

ネットで検索するのが億劫であれば、**Get-Help** に **-online** のパラメータを付けると、ブラウザからネット上のヘルプを表示してくれる。

このヘルプだが、自分が **Function** でコマンドレットを書く時も、コメントベースのヘルプを埋め込むことができる。

https://docs.microsoft.com/ja-jp/powershell/scripting/developer/help/examples-of-comment-based-help?view=powershell-7.1