操作しているOSに入っているPowerShellとは別バージョンのPowerShellを実行したい場合の手順です。
サーバで動くPowerShellをクライアントPCで開発することは良くあると思います。その際にサーバー側とクライアント側のPowerShellのバージョンが同じならば良いのですが、古いバージョンのPowerShellしか入っていないサーバに置くPowerShellを最新PowerShellが入っているクライアントPCで開発していると、いざサーバにPowerShellを配置してみたら動きが全く違うということもあるかと思います。
PowerShellのバージョンの見方は$PSVersionTableの変数に格納されています。
例えば、手元のWindows 8.1のPCではPowerShellのバージョンは4で、
PS > $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 4 0 -1 -1
Windows Server 2008のサーバではバージョン2のPowerShellが動いている時などです。
PS > $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 2 0 -1 -1
クライアントPCで、PowerShellのVersion3から有効になったConvertTo-Jsonを使ってスクリプトを作ったとします。
Get-Service | ConvertTo-Json
クライアントPCではうまく動いていたのにサーバー側では、エラーがでる。
PS> .\Get-ServiceAsJson.ps1 C:\script\service.json ConvertTo-Json : The term 'ConvertTo-Json' is not recognized as the name of a .... ===省略===
こんな時のために、PC側でスクリプトをテストするときにも旧バージョンのPowerShellを動かしたいということもあるかもしれません。
そんな時に使えるのが「PowerShell.exe」の引数である「-Version」または「-v」オプションです。
#通常通りVersion 4だとまく動く PS> .\Get-ServiceAsJson.ps1 <正常なアウトプット> #Version 2のPowerShellに対話モードで入る。表示されるコピーライトも古い PS> powershell -v 2 Copyright (C) 2009 Microsoft Corporation. All rights reserved. #同じようにスクリプトを実行してみると、今度はPowerShell Version 2で起きるエラーが出る。 PS >.\Get-ServiceAsJson.ps1 ConvertTo-Json : The term 'ConvertTo-Json' is not recognized as the name of a ....(省略) #EXITでPowerShell Version 2のプロンプトから抜けられます PS> exit #プロンプトを切り替えずとも-cや-commandオプションを使っても同じことが可能です PS> powershell -v 2 -c .\Get-ServiceAsJson.ps1 ConvertTo-Json : The term 'ConvertTo-Json' is not recognized as the name of a ....(省略)