首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WiX工具集:带有RemoveFolderEx的ICE03无效标识符

WiX工具集:带有RemoveFolderEx的ICE03无效标识符
EN

Stack Overflow用户
提问于 2022-06-11 11:01:39
回答 2查看 29关注 0票数 0

我正在尝试使用.msi工具集为Node.js项目创建WiX安装程序。我想在卸载过程中删除node_modules文件夹。以下是我的.wxs文件的相关摘录:

代码语言:javascript
运行
复制
<Property Id='APPLICATIONFOLDER'>
    <RegistrySearch Id='ApplicationFolder' Root='HKLM' Key='Software\[ProductName]' Name='InstallDir' Type='raw'/>
</Property>

<DirectoryRef Id='TARGETDIR'>
    <Component Id='RemoveFolder' Guid='3e2231d9-61b3-41a2-b407-8df015be537e'>
        <util:RemoveFolderEx Property='[APPLICATIONFOLDER]\node_modules' On='uninstall'/>
        <RegistryValue Root='HKLM' Key='Software\[ProductName]' Name='InstallDir' Type='string' Value='INSTALLDIR' KeyPath='yes'/>
    </Component>
</DirectoryRef>

我认为这将读取注册表中的值,将其分配给属性APPLICATIONFOLDER,然后在RemoveFolderEx标记中将字符串\node_modules附加到该属性的值。

但是当我试图通过light.exe运行这个程序时,我得到了ICE03: Invalid identifier; Table: WixRemoveFolderEx, Column: Property, Key(s): wrf1A1445CB13E8BF98989EA24E3514470A

显然,它对我的Property属性不满意,但是我需要什么来修复它呢?我见过很多指南使用这种通用模式,但是他们总是从注册表读取install值,然后对整个文件夹进行核弹。如果用户将文件添加到目录中,我不想删除它们。如何指定要删除的子文件夹?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-11 20:04:25

我已经解决了问题。因为我个人很难弄清楚--我在RemoveFolderEx上看到的指南都是用相同的用例来处理保存到注册表中的文件夹,而不是子文件夹;而且我发现WiX文档在大多数情况下并不是初学者友好的-,所以我在这里记录解决方案,以防其他人遇到同样的问题。

正如已经指出的那样,Property的工作方式与我在问题中所设想的不同--它确实只接受保存要删除的目录路径的属性的id。因此,您肯定需要以某种方式设置一个属性。(互联网上的一些指南并没有很清楚地说明这一点。)

要调查的下一个显而易见的路径是为属性分配一个经过修改的注册表搜索结果。然而,用WiX (据我所知)这是不可能的。

答案在于SetProperty。最后,这允许根据从注册表读取的属性设置一个新属性。

值得注意的是,这样做仍然可以防止删除安装文件夹,即使它是空的。但是,通过添加RemoveFolder (没有Ex)可以很容易地解决这一问题。这将删除文件夹,但只在文件夹为空的情况下。

让它为我工作的相关代码如下所示。

代码语言:javascript
运行
复制
<!-- Read the InstallDir from the registry and assign it to property APPLICATIONFOLDER -->
<Property Id='APPLICATIONFOLDER'>
    <RegistrySearch 
        Id='ApplicationFolder' 
        Root='HKLM' 
        Key='Software\[ProductName]' 
        Name='InstallDir' 
        Type='directory' 
        Win64='yes'/>
</Property>
            
<!-- Set new property NODE_MODULES_FOLDER by appending node_modules\ to APPLICATIONFOLDER -->
<SetProperty 
    Id='NODE_MODULES_FOLDER' 
    Value='[APPLICATIONFOLDER]node_modules\' 
    Before='CostInitialize'/>

<Component Id='RemoveFolders' Guid='...'>
    <!-- Remove the node_modules subfolder, using the property we created above -->
    <util:RemoveFolderEx Property='NODE_MODULES_FOLDER' On='uninstall'/>
    <!-- Remove main installation directory now, but only if it is empty. -->
    <!-- That's why we're using RemoveFolder instead of RemoveFolderEx here. -->
    <RemoveFolder Id='RemoveMainFolder' Property='APPLICATIONFOLDER' On='uninstall'/>
    <RegistryValue 
        Root='HKLM' 
        Key='Software\[ProductName]' 
        Name='InstallDir' 
        Type='string' 
        Value='[INSTALLDIR]' 
        KeyPath='yes'/>
</Component>
票数 1
EN

Stack Overflow用户

发布于 2022-06-11 15:31:21

我认为这将读取注册表中的值,将其分配给属性APPLICATIONFOLDER,然后在RemoveFolderEx标记中将字符串\node_modules附加到该属性的值。

不会的。正如医生说的Property是:

解析为源目录的完整路径的属性的id。

实现这一目标的最简单方法是编写您想要对注册表执行核弹的确切路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72583763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档