Powershell2.0ではまったReadKey

# Powershell2.0ではまったReadKey

- バージョンは調べて最新にしておこう
- 便利そうなコマンドは既にある

という話。

　[Powershell 逆引き \- Qiita](https://qiita.com/fumimix/items/3b886442f25f62f5b54f)のコメント欄で教えていただいたReadKeyを使った擬似Pauseを試そうとしたところ、次のようなエラーが……。

```PowerShell:PAUSE_IN_PS1
Write-Host "Press any key to continue ...";$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
```

```Powershell:エラー例
PS C:\> Write-Host "Press any key to continue ...";$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Press any key to continue ...
"1" 個の引数を指定して "ReadKey" を呼び出し中に例外が発生しました: "メソッドまたは操作は実装されていません。"
発生場所 行:1 文字:71
+ Write-Host "Press any key to continue ...";$x = $host.UI.RawUI.ReadKey <<<< ("NoEcho,IncludeKeyDown")
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException
```

　調べてみたところ、Version2.0ではこの機能がサポートされていない模様。[^WdI]
　確認してみたところ…うんまぁドハマり…。

```Powershell:バージョン確認
PS C:\> $PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.8669
BuildVersion                   6.1.7601.17514
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1
```

　[Windows PowerShell のインストール](https://docs.microsoft.com/ja-jp/powershell/scripting/setup/installing-windows-powershell?view=powershell-5.1)からWMF 5.1のインストーラーを貰ってきてPowershellのバージョンをあげようとしたら、WMF 5.1 requires .Net 4.5.ということでして……。

```Powershell:WMF5.1インストール失敗
PS C:\Win7AndW2K8R2-KB3191566-x64> .\Install-WMF5.1.ps1
警告: WMF 5.1 requires .Net 4.5.
C:\Win7AndW2K8R2-KB3191566-x64\Install-WMF5.1.ps1 : WMF 5.1 cannot be installed as pre-requis
ites are not met. See Install and Configure WMF 5.1 documentation: https://go.microsoft.com/fwlink/?linkid=839022
発生場所 行:1 文字:21
+ .\Install-WMF5.1.ps1 <<<<
    + CategoryInfo          : InvalidOperation: (C:\...-x64.msu:String) [Install-WMF5.1.ps1]、Invali
    dOperationException
    + FullyQualifiedErrorId : Install-WMF5.1.ps1
```

　.NET4.5.2を入れるところからスタートになりました。[\.NET Framework のインストール](https://msdn.microsoft.com/ja-jp/library/5a4x27ek(v=vs.110).aspx)より.NET4.5.2のインストーラーを取ってきてインストール→再起動。
 Install-WMF5.1.ps1をもう一度たたいてWMF5.1をインストール→再起動。

　結果、バージョンはあがりました。

```Powershell:バージョン確認
PS C:\>  $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.14409.1005
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.14409.1005
CLRVersion                     4.0.30319.34209
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```

　しかしISEで実行するとまたしても失敗。

```Powershell:ReadKey動かない……
PS C:\N> Write-Host "Press any key to continue ...";$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Press any key to continue ...
Exception calling "ReadKey" with "1" argument(s): "メソッドまたは操作は実装されていません。"
At line:1 char:44
+ ... to continue ...";$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : NotImplementedException
```


　このワンライナーをPauseIN.ps1として保存してコマンドラインから実行させることでうまくいきました。

```Powershell:PauseIN.ps1
PS C:\> .\PauseIN.ps1
Press any key to continue ...
（ここで応答を待つ）
```

## オチ
　いろいろがんばりましたが、Powershellのバージョンを最新にしておくとちゃんとpauseが入っているようです。

```Powershell:PauseIN.ps1
PS C:\> pause
Press Enter to continue...:
（ここで応答を待つ）
```


## 参考
- [Windows Management Framework \(WMF\) 5\.1がリリースされました \- しばたテックブログ](http://blog.shibata.tech/entry/2017/01/20/210740)
- [PowerShellを使って押されたキーを調べる \- Qiita](https://qiita.com/alchemist/items/16831029bc3a431be686)






[^WdI]: [Why do I get an exception calling 'ReadKey'?](https://social.technet.microsoft.com/Forums/ie/en-US/0787bcba-f977-400d-8b62-57ec64a71a8a/why-do-i-get-an-exception-calling-readkey?forum=winserverpowershell)