« SpolskyのLanguage Management | メイン | 文字化について考える »

Powershellスクリプトを64bit環境で使うためのメモ [softwares]

暑さ対策なのに暑そうな格好Windowsの次世代シェルであるPowershell,今までのコマンドプロンプトと比べるとかなりいろいろなことができるようになっているので自分用に簡単なスクリプトを書いてよく使っています.関連情報を扱うウェブサイトやライブラリも増えつつあります.

Powershellでは起動時にいろいろな関数や変数を記述したプロファイルを読み込むことができるようになっているのですが,最近OSをVista x64に変更したところ,LaunchyなどからPowershellを呼び出すとどうやってもプロファイルが読み込めません.一方でスタートメニューからプログラムをたどるか,「ファイル名を指定して実行」からpowershellと入力して起動すると普通に読み込めます.スクリプトの実行ポリシーを確認してみると前者の場合に限り,何度やってもRestrictedから変更できません.なぜだろうといろいろ試してみたところ解決できたのでメモをかねてエントリします.環境は以下の通り.

  • OS: Windows Vista Ultimate SP2 x64 Edition
  • PS: Powershell v2 CTP3

64bit環境でのPowershell

現段階では64bit環境でPowershellをインストールすると,32bit版と64bit版の2つのPowershellがインストールされるようです.またスクリプトの実行ポリシーを保管するレジストリの位置も違っています.具体的には以下の通り.

64bit
C:\Windows\System32\Powershell\1.0\powershell.exe
HKLM\SOFTWARE\Microsoft\Powershell\1\ShellIds\Microsoft.Powershell
32bit
C:\Windows\SysWOW64\Powershell\1.0\powershell.exe
HKLM\SOFTWARE\Wow6432node\Microsoft\Powershell\1\ShellIds\Microsoft.Powershell

となっています.ファイル名を指定して実行からPowershellを呼び出すと前者が,Launchy経由で呼び出すと後者が起動します.SysWOW64は32bitアプリケーションのリダイレクト先なので,Launchy経由で呼び出すと32bitで起動していることがわかります.

原因は何か(確証ないけど)

スクリプトを使いたい場合,64bit環境では以下のように入力してEnter.

PS > Set-ExecutionPolicy RemoteSigned

こうすると署名されたスクリプトが利用できるようになります.ほいでこの情報は前述のレジストリに,文字列値:ExecutionPolicy,値:RemoteSignedとして保管されます.

一方32bit環境でスクリプトの実行ポリシーが格納されているレジストリはHKLM\SOFTWARE\Wow6432node\Microsoft\Powershell\1\ShellIds\Microsoft.Powershellになるはずなのに(たぶん),実際には参照しているキーの位置が64bitのものなのでいくらがんばっても32bit(Wow6432node)の実行ポリシーが変更できません.おそらく32bitアプリケーションから呼び出していることが原因なのですが,なんというめんどくさい仕様でしょう.

というわけで対応方法

レジストリエディタを開いて上記のHKLM\Wow6432node内に実行ポリシーを追加すればよいです.もしくはPowershellからレジストリを以下のように操作(もちろん「管理者として実行」する必要があります).

PS > Set-ItemProperty HKLM:SOFTWARE\Wow6432node\Microsoft\Powershell\1\ShellIds\Microsoft.Powershell -name ExecutionPolicy -value RemoteSigned

どちらの場合でも実行後の結果は同じです.せっかくなのでPowershellでやってみたいところですが,実際に変更する前には最後に-whatifをつけてテストすることをおすすめします.

最後に,これは私の環境ではこれでうまくいきましたということなので他の環境ではどうなるかわかりません.なにしろLaunchy経由で呼び出さずに,スタートメニューもしくはファイル名を指定して実行から起動すればこんなことをする必要がありません.なのでマシンが起動しなくなった!(ないとは思いますが)としても責任はとれませんし,質問をされても答えられません.レジストリの操作が絡む話なのでくれぐれも慎重に.以下に参考になりそうなウェブサイトを載せておきます.

トラックバック (0)

このエントリーのトラックバックURL: http://dormouse.oops.jp/mtc/mt-tb.cgi/5

(スパム対策として当該エントリへのリンクが含まれないトラックバックを弾いています)

以下の一覧は、このエントリーを参照しています:  Powershellスクリプトを64bit環境で使うためのメモ

コメント (0)

コメントを投稿

(コメントは承認制をとっているため,公開されるまで時間がかかる場合があります)


画像の中に見える文字を入力してください。