はじめに
私が今働いている会社も32bitアプリケーションがWindows10やWindows7で運用されていたりします。
Windows10は64bit OS、Windows7以前は32bit OSで動いています。
今回のアプリケーションは、パッケージで環境に展開するのですが、その際バッチファイルでレジストリ登録処理をする箇所があります。
この記事では、32bitアプリケーションがバッチファイルでレジストリ登録する際になぜか登録ができなかった原因、そしてどう解決したのか備忘録として書いていこうと思います。
アプリケーションのバッチファイルによるレジストリ登録で困った問題点
そもそも期待された動きとして、32bit OSと64bit OSでレジストリ登録したいキー値がことなるようにしたかったのです。
これはあくまで例なのですが、以下のように登録したかったのです。
32bit OS
HKLM\SOFTWARE\Key
Key=1
64bit OS
HKLM\SOFTWARE\WOW6432Node\Key
Key=1
64bit OSで32bitアプリケーションを動かす際、リダイレクトと呼ばれるOSの機能によって登録されるキーの場所が異なります。(レジストリのリダイレクトについてはこちらから)
今回はOSによってレジストリキーの登録先が変わります。なので、OSによってバッチファイルが登録先を変更できるように実行したかったのです。
OSのbit数をコマンドプロンプトで判断する方法
そもそもOSが32bitか64bitかを判断する場合はコマンドプロンプトで%PROCESSOR_ARCHITECTURE%
を入力することで判断できます。
> %PROCESSOR_ARCHITECTURE
bit数に応じて、以下の結果が返ってきます。
OS | 返送結果 |
---|---|
32bit | x86 |
64bit | AMD64 |
そのため、バッチファイルでOSで処理を分岐させたい場合は、次のように書けばできます。
if %PROCESSOR_ARCHITECTURE% equ "x86" (
// 32bit OSで実行したいコマンドを記載する。
) else (
// 64bit OSで実行したいコマンドを記載する。
)
なぜ64bit OSでバッチファイルによるレジストリ登録できなかった?
コマンドプロンプトの実行ファイル名はcmd.exeです。
実は64bitOSで32bitアプリケーションがバッチファイルを実行する時、cmd.exeは64bitではなく32bitで動きます。
cmd.exeは32bitと64bitで実行ファイルが異なります。
32bitアプリケーションがバッチファイルを実行する場所
実行OS | ファイルパス |
---|---|
32bit | c:\windows\Syswow6432\cmd.exe |
64bit | c:\windows\System32\cmd.exe |
このように同じcmd.exeでも32bitか64bitかで実行場所が異なるため、バッチファイルがjっ甲できても上手く分岐ができませんでした。
どう対処した?
結論から言うと、%PROCESSOR_ARCHITEW6432%
で解決できました。
このコマンドは返却結果が、%PROCESSOR_ARCHITECTURE%
と違います。
OS | 返却結果 |
---|---|
32bit | not found |
64bit | AMD64 |
なので、バッチファイルで分岐する場合は次のようにすれば大丈夫です。
if "%PROCESSOR_ARCHITEW6432%" equ "AMD64" (
// Win10で実行したいコマンドを記載する。
) else (
// 32bit OSで実行したいコマンドを記載する。
)
Windows10で32bitアプリケーションのバッチファイルによるレジストリ登録が正常にできるようになりました。
これでリダイレクトの問題も解決です。
最後に
プログラミングの問題ならエラーやログを見れば解決できそうでしたが、コマンドプロンプトの実行exeの問題だったとは思わなかったので思わぬ沼にはまって1日消化してしまいました。
新たな知識が得られたと前向きに捉えて、開発業務をしたいと思います。
PS
Twitterやってます。
https://twitter.com/koji1122wiki
エンジニアとして色々発信しているのでよかったらフォローお願いします。
また質問などはこの記事のコメントからでもツイッターのDMでも大丈夫です。
それでは長々と見てくださり有難うございました!
参考文献
https://ss64.com/nt/syntax-64bit.html
https://wa3.i-3-i.info/word14254.html