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)に関するバージョン(およびビルド)情報や、インストール済みOffice(Windows版限定)のバージョン情報を表示させるシェルスクリプトを紹介した。

当初から述べてきたように、Office自体のアップデートはグローバル全体でほぼ同じタイミングながらも、「Office 365の新機能」の更新は米国と比べると若干の遅延がある。そこで、今回は「What's new in Office 365」の情報も同様に取得するコードを追加した。

いつもどおり任意のテキストエディターに以下の内容を入力し、必要に応じて出力先のパスなどを変更してから、chmodコマンドなどで実行権限を与えて動作を確認してほしい。

 #!/bin/bash

 URLjp='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'
 URLus='https://support.office.com/en-us/article/What-s-new-in-Office-365-95c8d81d-08ba-42c1-914f-bca4603e1426?ui=en-US&rs=en-US&ad=US'
 REGKey=HKLM\\SOFTWARE\\Microsoft\\Office\\ClickToRun\\Configuration
 REGValue=VersionToReport
 IFS_Backup=$IFS
 IFS=$'\n'

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

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

 TmpFile2=$(mktemp)
 curl -s $URLus -o $TmpFile2
 for Obj2 in `cat $TmpFile2 | grep 'Latest updates for' -A 1 | \
    perl -pe 's/<[^>]*>//g; s/--//g; s/^[ ]*//g; s/\r\n//m'`; do

    case ${Obj2} in
        *Windows\ Desktop* )
            WinUS=$(echo $Obj2 | cut -d " " -f 14-16);;
        *Mac* )
            MacUS=$(echo $Obj2 | cut -d " " -f 16-17) ;;
        *iOS* )
            iOSUS=$(echo $Obj2 | cut -d " " -f 16) ;;
        *Android* )
            AndroidUS=$(echo $Obj2 | cut -d " " -f 16) ;;
        *Windows\ Mobile* )
            WMUS=$(echo $Obj2 | cut -d " " -f 18) ;;
    esac
 done

 echo -e "Windows版バージョン(JP)\t\t" $WinJP
 echo -e "Windows版バージョン(US)\t\t" $WinUS
 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] ]] ; then
    echo -e "Windows版インストール済み\t" $REGStr
 fi
 echo -e "Mac版(JP)\t\t\t" $MacJP
 echo -e "Mac版(US)\t\t\t" $MacUS
 echo -e "iOS版(JP)\t\t\t" $iOSJP
 echo -e "iOS版(US)\t\t\t" $iOSUS
 echo -e "Android版(JP)\t\t\t" $AndroidJP
 echo -e "Android版(US)\t\t\t" $AndroidUS
 echo -e "Windows Mobile版(JP)\t\t" $WMJP
 echo -e "Windows Mobile版(US)\t\t" $WMUS

 rm $TmpFile1 $TmpFile2
 IFS=$IFS_Backup

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

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

それではシェルスクリプトの内容を解説しよう。今回の注目点は31~48行目に追加した取得部分。基本的な内容は日本語版公式ページと同じように、curlでHTMLファイルを取得し、grepで「Latest updates for」を含む行および次の行までの取得。その結果をperlで加工している。また、取得した文字列が「Latest updates for Windows DesktopTake~」となったため、case文のパターンはワイルドカードを前方にも追加した。

実行結果をご覧になるとひと目で分かるように、Windows版などは同じバージョンながらも、iOS版のみ米国版が先行している。このようにWebページにアクセスせずとも、簡単な情報を手軽に取得できるため、業務内容に応じてカスタマイズしてほしい。