Windows installer 如何判断属性是否通过命令行传入?

Windows installer 如何判断属性是否通过命令行传入?,windows-installer,advanced-installer,Windows Installer,Advanced Installer,我想通过C#自定义操作初始化APPDIR,但我只想在APPDIR没有作为命令行参数提供的情况下这样做(在我们的引导程序中有自定义逻辑,我想在设置MSI的默认路径时使用它,因为我们都提供了) 我已经试着查看了这些表,但是看起来好像命令行参数设置在那里 日志输出: MSI(c)(A0:78)[16:40:33:995]:命令行:APPDIR=c:\WHAT CURRENTDIRECTORY=E:\CLIENTUILEVEL=0 CLIENTPROCESSID=10912 当我在命令行上设置APPDI

我想通过C#自定义操作初始化APPDIR,但我只想在APPDIR没有作为命令行参数提供的情况下这样做(在我们的引导程序中有自定义逻辑,我想在设置MSI的默认路径时使用它,因为我们都提供了)

我已经试着查看了这些表,但是看起来好像命令行参数设置在那里

日志输出:

MSI(c)(A0:78)[16:40:33:995]:命令行:APPDIR=c:\WHAT CURRENTDIRECTORY=E:\CLIENTUILEVEL=0 CLIENTPROCESSID=10912


当我在命令行上设置
APPDIR=C:\WHAT
时,我找不到一个位置来检查某个值是否实际上是由命令行设置的(而不是默认值、UI或自定义操作)。

您应该能够通过在安装的各个阶段查找属性来实现这一点。如果它在UI序列开始之前(以及任何可能更改它的自定义操作之前)存在,则根据定义,它必须在命令行上设置。因此,您可以拥有一个属性SETONCOMMANDLINE,并拥有一个类型51自定义操作(一个set属性CA),该操作使用条件APPDIR将SETONCOMMANDLINE设置为true,因此仅当已经设置了APPDIR时才会设置它

在UI序列之后(以及可能改变它的任何其他操作之前),对SETINUI属性执行相同的操作。拥有一个属性集CA,该属性集CA将SETINUI设置为true,条件是-APPDIR而不是SETONCOMMANDLINE-因此,如果SETINUI已设置为值,但未通过命令行设置,则它将为true。但在设置APPDIR的同时设置用户界面SETINUI可能更简单


当你需要知道它是如何设置的时候,如果-不是SETINUI,也不是SETONCOMMANDLINE-

有趣的问题,你可以这样做。我已经这样做了,但希望看到一个独立于msiexec的解决方案。我实际上希望使用msiexec,但我希望在MSI中的条件下查询MSI接收到的命令行参数。我可以通过等待UI对话框的显示来解决这个问题,但是对于静默安装来说,这不太好。将APPDIR设置为默认值(例如“ChangeMe”),然后在InstallExecuteSequence中的InstallInitialize之前安排自定义操作,条件是只有APPDIR等于默认值时才会运行。我假设您使用C#自定义操作是有特定原因的,而不仅仅是在属性上设置默认值,这将完全消除对自定义操作的需要。如果启动时高级安装程序没有对其进行验证逻辑,则默认值将起作用;不过,这有点像黑客。如果可能的话,尽量避免这样做,但最终这可能是我的解决方案。不幸的是,这是一个具有默认值的高级安装程序属性。用户可能在命令行上设置了相同的值,而这种性质的检查不会告诉我是否是这样。您所说的“默认值”是什么意思?如果这意味着AI生成CA来设置默认值,那么只需在MSI文件中找到发生这种情况的位置,并在此之前进行检查,这就是为什么我说“在任何可能更改它的自定义操作之前”,因为只有AI生成CA来设置默认值时,它才能具有默认值(如程序文件)。在MSI中,您会看到一个类型51 CA来设置它,它可能不会在AI IDE中公开。我还建议删除WiX标签!我明天会试试看。谢谢你的补充信息!