是否可以通过自定义操作读取包代码作为读取 ProductCode 和 ProductName。我想删除在 %LOCALAPPDATA%/Downloaded Installations/GUID 中创建的 MSI 缓存,其中 GUID 是卸载期间的包代码。
问问题
577 次
2 回答
0
You might want to take a look at this code I wrote awhile back: (the entire thread is a good read)
Local cached MSI does not get deleted when uninstalling
<CustomAction Id="PurgeCache_CAD_Install" Execute="immediate" Property="PurgeCache" Value="/CacheRoot=[CommonAppDataFolder]Downloaded Installations\MyCompany\MyProduct /PackageCode=[PackageCode] /InstallMode=Install"/>
<CustomAction Id="PurgeCache_CAD_Uninstall" Execute="immediate" Property="PurgeCache" Value="/CacheRoot=[CommonAppDataFolder]Downloaded Installations\MyCompany\MyProduct /PackageCode=[PackageCode] /InstallMode=UnInstall"/>
<InstallExecuteSequence>
<Custom Action="PurgeCache_CAD_Install" After="ScheduleReboot">Not REMOVE="ALL"/>
<Custom Action="PurgeCache_CAD_Uninstall" After="ScheduleReboot">REMOVE="ALL"/>
</InstallExecuteSequence>
export prototype PurgeCache(HWND);
function PurgeCache(hMSI)
number nResult;
string szInstallMode;
string szCacheRoot;
string szDir;
string szPackageCode;
LIST listDirs;
begin
szInstallMode = MsiGetCustomActionDataAttribute( hMSI, "/InstallMode=" );
szCacheRoot = MsiGetCustomActionDataAttribute( hMSI, "/CacheRoot=" );
szPackageCode = MsiGetCustomActionDataAttribute( hMSI, "/PackageCode=" );
listDirs = ListCreate (STRINGLIST);
FindAllDirs( szCacheRoot, EXCLUDE_SUBDIR, listDirs );
nResult = ListGetFirstString (listDirs, szDir);
while (nResult != END_OF_LIST);
if ( szInstallMode = "Uninstall" || !( szDir % szPackageCode )) then
DeleteDir( szDir, ALLCONTENTS );
endif;
nResult = ListGetNextString (listDirs, szDir);
endwhile;
return ERROR_SUCCESS;
end;
于 2013-08-20T19:38:01.197 回答
0
让我们来看看。首先我们必须回答包代码存储在哪里。包代码在其第三段中对此进行了介绍:“包代码存储在摘要信息流的修订号摘要属性中。” 好的,那我们怎么读呢?这在使用摘要信息流中进行了介绍,您从调用MsiGetSummaryInformation开始。但是此代码将从自定义操作中调用,因此让我们验证它是否正常。不用于自定义操作的函数涵盖了这一点。扫描列表我们发现没有提到摘要信息函数(除了 MsiCreateTransformSummaryInfo ,我们在这里不需要)。
所以是的,这是可能的。
于 2013-08-20T12:10:09.057 回答