最新OS上で古いバージョンのPowerShellを実行する

操作している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 ....(省略)