Powershell2.0ではまったReadKey
- バージョンは調べて最新にしておこう
- 便利そうなコマンドは既にある
という話。
Powershell 逆引き - Qiitaのコメント欄で教えていただいたReadKeyを使った擬似Pauseを試そうとしたところ、次のようなエラーが……。
Write-Host "Press any key to continue ...";$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
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ではこの機能がサポートされていない模様。1
確認してみたところ…うんまぁドハマり…。
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 のインストールからWMF 5.1のインストーラーを貰ってきてPowershellのバージョンをあげようとしたら、WMF 5.1 requires .Net 4.5.ということでして……。
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 のインストールより.NET4.5.2のインストーラーを取ってきてインストール→再起動。
Install-WMF5.1.ps1をもう一度たたいてWMF5.1をインストール→再起動。
結果、バージョンはあがりました。
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で実行するとまたしても失敗。
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として保存してコマンドラインから実行させることでうまくいきました。
PS C:\> .\PauseIN.ps1
Press any key to continue ...
(ここで応答を待つ)
オチ
いろいろがんばりましたが、Powershellのバージョンを最新にしておくとちゃんとpauseが入っているようです。
PS C:\> pause
Press Enter to continue...:
(ここで応答を待つ)