まとめ
32ビットアプリケーションから、Windows PowerShellを起動することで、意図せず32ビット版のWindows PowerShellが起動してしまうことがある。
64ビット版Windows上で、32ビットプロセスからWindows PowerShellを起動する場合は、SysNative 経由にすることで 64ビット版を明示的に起動できる。
再現手順
- 32ビット版である、
C:\Windows\SysWOW64\cmd.exeを直接起動する - 以下のコマンドを実行する
> powershell -Command "[Environment]::Is64BitProcess"
False
[Environment]::Is64BitProcess は、現在起動している PowerShell プロセスが 64 ビットかどうか を返します。
そのため、32ビット版として起動している場合は False、64ビット版なら True になります。
64ビット版のWindows PowerShellを起動する
32ビットアプリケーションであっても、SysNative 経由で64ビット版のPowerShellを起動することができます。
- 32ビット版である、
C:\Windows\SysWOW64\cmd.exeを直接起動する - 以下のコマンドを実行する
> %SystemRoot%\SysNative\WindowsPowerShell\v1.0\powershell.exe -Command "[Environment]::Is64BitProcess"
True
このように実行することで、64ビット版のPowerShellが起動していることを確認できます。
注意点
ただし、64ビット版である、C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe を指定することでは、32ビットアプリケーションからは、意図せず32ビット版のPowerShellが起動してしまいます。
- 32ビット版である、
C:\Windows\SysWOW64\cmd.exeを直接起動する - 以下のコマンドを実行する
> C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command "[Environment]::Is64BitProcess"
False
32ビットプロセスからの「System32」アクセスは、32ビット用システムフォルダー(通常は SysWOW64)へリダイレクトされてしまうからです。
そのため、このパスを指定しても、32ビット版のWindows PowerShellが起動してしまいます。
なお、SysNative は通常の実フォルダーではなく、32ビットプロセス向けに用意された特殊なエイリアスです。
そのため、エクスプローラーから直接アクセスすることはできません。
実際の利用場面
サーバー移行を実施しており、旧環境で動いていたPowerShellスクリプトを、新環境へ移行していました。
新環境では、WindowsOSのバージョン差分の影響もあり、事前処理を64ビット版のWindows PowerShellで実行する必要がありました。
元々、32ビットアプリケーションから呼ばれる処理であったため、意図せず32ビット版のWindows PowerShellが起動してしまい、事前処理がエラーとなってしまいました。
SysNative経由で、64ビット版のWindows PowerShellを起動することで、事前処理が正常に実行できるようになりました。
参考情報