Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBUW(Bash on Ubuntu on Windows)が動作し、各種Linuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。

インストール済みOfficeのバージョンも取得する

さて前回は、Microsoftのサブスクリプションサービスである「Office 365」に含まれる最新バージョンのOffice(=Office 2016)に関するバージョン(およびビルド)情報を取得し、標準出力に書き込むシェルスクリプトを紹介した。だが、多くの読者はお使いのPCにOffice 365がインストール済みであり、そのバージョン情報をアカウントページから確認するのは少々面倒である。

<ファイル>メニュー→<アカウント>と順に選択すると、Officeのバージョン(およびビルド)を確認できる

そこでインストール済みOfficeのバージョン情報が、どこに格納されているか調べてみたところ、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configurationキーがマッチした。文字列値「VersionToReport」には、上図で示されたバージョン情報がデータとして格納されているため、同値をシェルスクリプト内から取得すればよい。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configurationキーの文字列値「VersionToReport」には、Officeのバージョン情報が格納されている

Linux上からWindowsのregistryにアクセスするコマンドとしてlibhivex-binに含まれる「hivexget」などのコマンドがあるらしいが、今回はWindows 10の「reg.exe」を使った方法でシェルスクリプトを作成した。いつもどおり任意のテキストエディターに以下の内容を入力し、必要に応じて出力先のパスなどを変更してから、chmodコマンドなどで実行権限を与えて動作を確認してほしい。

 #!/bin/bash

 URL='https://support.office.com/ja-jp/article/Office-365-%e3%81%ae%e6%96%b0%e6%a9%9f%e8%83%bd-95c8d81d-08ba-42c1-914f-bca4603e1426?ui=ja-JP&rs=ja-JP&ad=JP'
 REGKey=HKLM\\SOFTWARE\\Microsoft\\Office\\ClickToRun\\Configuration
 REGValue=VersionToReport
 IFS_Backup=$IFS
 IFS=$'\n'
 TmpFile=$(mktemp)

 curl -s $URL -o $TmpFile
 for Obj in `cat $TmpFile | grep \
    -e 'デスクトップ向け最新の更新プログラム' \
    -e '向けの最新更新プログラム' -A 2 | \
    perl -pe 's/<[^>]*>//g; s/--//g; s/^[ ]*//g; s/\r\n//m'`; do

    case ${Obj} in
        Windows\ デスクトップ* )
            Win=$(echo $Obj | cut -d " " -f 3-5) ;;
        Mac* )
            Mac=$(echo $Obj | cut -d " " -f 4-5) ;;
        iOS* )
            iOS=$(echo $Obj | cut -d " " -f 4) ;;
        Android* )
            Android=$(echo $Obj | cut -d " " -f 4) ;;
        Windows\ Mobile* )
            WM=$(echo $Obj | cut -d " " -f 5) ;;
    esac
 done

 echo -e "Windows版バージョン\t" $Win
 ARRAY=(`reg.exe query $REGKey /v $REGValue`) 2>/dev/null
 REGStr=(`echo ${ARRAY[2]} | awk '{print substr($0, index($0, "Z"+1))}'`)
 if [[ $REGStr =~ ^[0-9] ]] ;
    echo -e "インストール済みOffice\t" $REGStr
 fi
 echo -e "Mac版\t\t\t" $Mac
 echo -e "iOS版\t\t\t" $iOS
 echo -e "Android版\t\t" $Android
 echo -e "Windows Mobile版\t" $WM

 rm $TmpFile
 IFS=$IFS_Backup

本シェルスクリプトを実行すると、日本語版の公式サイトからHTMLファイルを取得し、各OSのバージョン情報を抽出した後、レジストリにアクセスしてインストール済みOfficeのバージョン情報を取得。そして標準出力に書き出す。

シェルスクリプトを実行した状態。各OSのバージョン(ビルド番号)などが表示される

それではシェルスクリプトの内容を解説しよう。今回の注目点は33~35行目の部分。33行目は「reg.exe」で変数REGKeyで定義したHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configurationキーと、変数REGValueで定義した文字列値「VersionToReport」の情報を取得し、配列ARRAYに格納している。今回変数ではなく配列にしたのは、取得情報に値の種類など不用な情報が含まれるためだ。

34行目は配列ARRAYに格納された情報からバージョン情報だけを取得し、そこからawkで不用な部分を削除した結果を、変数REGStrに格納している。なお、Officeがインストールされていない場合はエラーを吐く。また、今回は出力結果が冗長に感じたため、38~41行目で実行するechoの内容を若干修正した。前回の記事で述べた日米版の差に関する課題が残ってしまったが、こちらは次回以降の設題として残しておく。

阿久津良和(Cactus)