Office 365のデスクトップアプリケーションをバッチファイルで修復
能書き
Office 2013ってよく壊れません?
インストールされている台数が多いというのもあるけど、週に数回ほどOfficeが不調だという問い合わせがくるので、その都度Officeの修復を案内しています。
Officeの修復は結構優秀なようで、問い合わせの7〜8割はこれで直る。
でも修復の手順が地味に面倒くさい。
- コントロールパネルのプログラムのアンインストールを開く
- Microsoft Office ProPlusを選択して変更
- 修復方法を選ぶ
- 修復開始
ということでお手軽に実行できるようにバッチファイルにしてみました。
コード
@echo off
net session >nul 2>&1
if %errorLevel% == 2 (
echo 管理権限で実行されていません。
echo 右クリックして「管理者として実行」で実行してください。
echo.
pause
exit /b
)
set PARM=scenario=Repair culture=ja-jp ForceAppshutdown=True RepairType=QuickRepair DisplayLevel=True
for /F delims^=^"^ tokens^=2 %%a IN ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - ja-jp" /v ModifyPath') DO SET C2R=%%a
if defined C2R (
start "" "%C2R%" %PARM%
)
Office 2013/2016、32bit/64bit対応。
解説
Officeの修復は、OfficeClickToRun.exeに修復パラメータを付けて実行することで開始されます。
しかし、OfficeClickToRun.exeの場所はOfficeのバージョン等で異なるため、バッチファイルにフルパスで書くわけにもいきません。
ではどうやってパスを取得するか。
答えはレジストリにありました。
日本語版のOffice 365 ProPlusの場合はHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\O365ProPlusRetail - ja-jp
のModifyPath
に、フルパスと修復パラメータが格納されています。
例えばこんな感じ。
バッチファイルでレジストリの値を扱う場合、reg query
コマンドで返った文字列をfor /F
で抜き出して変数に格納します。
今回の場合はfor /F
のオプションで"delims=" tokens=2"
と指定したいところですが、オプション自体がダブルクォートで括られているため、delimsに"
を指定できません。
ダブルクォートで括る代わりに、ホワイトスペースと記号をエスケープ記号^
でエスケープすることにより、区切り文字として"
を指定できるようにしています。
for /F delims^=^"^ tokens^=2 %a in ('reg query "HKEY...
修復モードはset PARM=
の行で設定しています。
RepairType
にFullRepair
を指定すればオンライン修復になります。
OfficeClickToRun.exeは管理者として実行する必要があります。
一般ユーザ権限で実行しても何も起きないので、バッチファイルの頭の方で管理者として実行されているかチェックしています。