Witam,
Mam taki mały skrypt w pliku '.bat':

@echo on
SET PackageName=Office2003
SET LogFolder=%SystemDrive%\Logs\%PackageName%
SET "ROLLBACK=0"
if not exist "%LogFolder%" md "%LogFolder%"
SET PRODUCTKEY=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
REG QUERY %PRODUCTKEY%\{1843BA9E-803B-4BFC-ABAF-DA89BD835E1A}
if not %ERRORLEVEL% EQU 0 (
	msiexec /i "%~dp0Office\%PackageName%_Basic.msi" TRANSFORMS="%~dp0Office\%PackageName%_Basic.mst" /l*v "%LogFolder%\%PackageName%_Basic_Install.log" /qn
)

REG QUERY %PRODUCTKEY%\{5182FA4D-A9E0-4958-9351-F60CF2D35AB3}
if not %ERRORLEVEL% EQU 0 (
	msiexec /i "%~dp0OfficeAddIn\%PackageName%_OfficeAddIn.msi" TRANSFORMS="%~dp0OfficeAddIn\%PackageName%_OfficeAddIn.mst" /l*v "%LogFolder%\%PackageName%_OfficeAddIn_Install.log" /qn
	set "ret1=!errorlevel!"
	if not !ret1!==0 set "ROLLBACK=1"
	if not !ret1!==3010 set "ROLLBACK=1"
	if !ROLLBACK!==1 (
		msiexec /x {1843BA9E-803B-4BFC-ABAF-DA89BD835E1A} /l*v "%LogFolder%\%PackageName%_Basic_Rollback_Uninstall.log" /qn
		exit /b !ret1!
	)
)

REG QUERY %PRODUCTKEY%\{B3DC5634-3E23-4C47-BB72-09B715B27C40}
if not %ERRORLEVEL% EQU 0 (
	msiexec /i "%~dp0OfficeLangPack\%PackageName%_LangPack.msi" TRANSFORMS="%~dp0OfficeLangPack\%PackageName%_LangPack.mst" /l*v "%LogFolder%\%PackageName%_LangPack_Install.log" /qn
	set "ret2=!errorlevel!"
	if not !ret2!==0 set "ROLLBACK=1"
	if not !ret2!==3010 set "ROLLBACK=1"
	if !ROLLBACK!==1 (
	msiexec /x {5182FA4D-A9E0-4958-9351-F60CF2D35AB3} /l*v "%LogFolder%\%PackageName%_OfficeAddIn_Rollback_Uninstall.log" /qn
	msiexec /x {1843BA9E-803B-4BFC-ABAF-DA89BD835E1A} /l*v "%LogFolder%\%PackageName%_Basic_Rollback_Uninstall.log" /qn
	exit /b !ret2!
)
)

Warunek !ROLLBACK!==1 ma się wykonywać wtedy gdy w trakcie instalacji walnie błędem. Niestety coś nie dobrze mi tu działa bo można powiedzieć, że rollback wykonuje się losowo. Od czego zależy użycie ! i % przy obsłudze zmiennych?
Pozdrawiam