最近在使用Wix Toolset v3为我写好的程序穿件打包安装程序时。想要在安装时写一个注册表。这个时候就发现一个很正常的需求把我挡住了:
“我需要在键值中写入双引号”
一般的,对于经常写代码的同学来说:这是基础知识,并不难啊!转义字符加上不就行了,像这样:\”。天真的我也是这么想的,然后:
第一段是在资源管理器右键菜单加上一个选项,名为:”Copy Here”
<RegistryValue Id="EXPLORERRIGHTMENU" Action="write" Root="HKCR" Key="Directory\Background\shell\CopyEveryWhere" Value="Copy Here" Type="string" />
点击之后会执行下面第二段Value属性定义的命令:
“xcopy /E /V /C /Q /H /Y \”[INSTALLFOLDER]*\” %v.\”。
即复制我安装目录的所有文件到当前根目录
<RegistryValue Id="EXPLORERRIGHTMENUCOMMAND" Action="write" Root="HKCR" Key="Directory\Background\shell\CopyEveryWhere\command" Value="xcopy /E /V /C /Q /H /Y \"[INSTALLFOLDER]\" %v.\" Type="string" />
[INSTALLFOLDER]这里举例来说指向目录: C:\Program Files\MyTool
由于命令行中参数存在空格时,正确的识别必须加上双引号。所以就有了此次踩坑记
然后编译
错误原因
实际上Wix ToolSet编译器由于并不识别转义字符\,于是把: “xcopy /E /V /C /Q /H /Y \”认为是Value的值。后面的: [INSTALLFOLDER]\” %v.\” Type=”string”对于Wix ToolSet编译器来说自然就不认识,所以才会报错。
解决方案
对于我这种英语渣来说,看官方手册仅仅是为了找使用方法,但是像这种问题我一直也没找着哪里在说怎么用
经过各种查找,终于在SourceForge上面发现了Wix的一个Bug report,Bug Reporter上传了一份附件,看里面里面的源码才发现了这个哭笑不得的用法:
<RegistryValue Id="EXPLORERRIGHTMENUCOMMAND" Action="write" Root="HKCR" Key="Directory\Background\shell\CopyEveryWhere\command" Value='xcopy /E /V /C /Q /H /Y "[INSTALLFOLDER]" %v.' Type="string" />
发现了吗?在单引号里面使用双引号就可以了,不需要转义字符。
参考链接
SourceForge上的Wix ToolSet Bug报告
在Windows资源管理器中添加一个菜单项