@echo off

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Repair iTunes Installation
:: @author Kenichi Maehashi - Copyright (C) 2009, All Rights Reserved.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

call :_INIT_ %*
call :_MAIN_
call :_EXIT_
goto :_END_

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:_INIT_
:: スクリプトの初期化を実行します。
:: @param %* 無視されます。

:: 検索するプログラムの Display Name を指定します。
set DISPLAY_NAME=iTunes

:: iTunes がインストールされているかどうかを保持します。
set found=0

goto :_END_

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:_MAIN_
:: iTunes のインストールを検索し、修復を行います。

echo iTunes を検索しています。しばらくお待ちください...
echo ダイアログが表示されたら、「修復する」ボタンをクリックしてください。
echo.
for /F "usebackq" %%k in (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products"`) do (
	call :processProduct "%%k"
)

if %found% == 0 (
	echo エラー: インストール済みの iTunes を検出できませんでした。
	echo Apple 社の Web サイトから、再度 iTunes をインストールしてください。
	echo.
	echo 何かキーを押すと終了します。
	pause > nul
)

goto :_END_

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:_EXIT_
:: スクリプトの終了時に呼び出されます。

goto :_END_

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:processProduct
:: 渡された製品のレジストリパスから製品名を探し、比較します。
:: @param %1 検索対象となる製品の、Products 以下のレジストリパスを指定します。

:: 既に iTunes が見つかっている場合は、何も実行しません。
if %found% == 1 goto :_END_

:: 各レジストリキーの InstallProperties に書かれている DisplayName と検索対象の製品名を比較します。
for /F "tokens=2* usebackq" %%p IN (`reg query "%~1\InstallProperties" /v DisplayName /t REG_SZ 2^>nul ^| findstr DisplayName`) DO (
	if "%%q" == "%DISPLAY_NAME%" (
		set found=1
		call :iTunesFound %1
		goto :_END_
	)
)

goto :_END_

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:iTunesFound
:: iTunes のレジストリパスから、ModifyPath を検索します。
:: @param %1 iTunes の Products 以下のレジストリパスを指定します。

:: ModifyPath を検索します。
set modifyPath=
for /F "tokens=2* usebackq" %%p IN (`reg query "%~1\InstallProperties" /v ModifyPath /t REG_EXPAND_SZ 2^>nul ^| findstr ModifyPath`) DO (
	set modifyPath=%%q
)

if "%modifyPath%" == "" (
	echo エラー: iTunes が正常にインストールされていないため、修復できません。
	echo Apple 社の Web サイトから、再度 iTunes をインストールしてください。
	echo.
	echo 何かキーを押すと終了します。
	pause > nul
	goto :_END_
)

:: ModifyPath を起動します。
%modifyPath%

goto :_END_

:_END_
