更新2 feature request已被拒绝,原因只是因为WiX无法支持cmd.exe提供的这些“假”变量。所以下面接受的答案仍然是最好的解决方案。
更新:我已发出添加预处理器动态环境变量支持的功能请求。一旦开发人员回应,我就会更新这个帖子。
原始问题:
我想在设置属性时编写日期。
<Property Name="BuildDate" Value="$(env.Date)" />
或
<Property Name="BuildDate" Value="$(sys.Date)" />
在
时抛出CNDL0150:“未定义的预处理器变量”<Property Name="BuildDate" Value="[Date]" />
当然会将字符串“[Date]”写入MSI属性。
我怎样才能做到这一点?
编辑:我在所有情况下都试过“日期”,结果相同。此外,添加一个名为“BuildDate”的新环境变量并将其设置为“%DATE%”将删除编译错误,但写入MSI的值不会解析为实际日期,而是产生字符串“%DATE% ”
答案 0 :(得分:4)
例如,您可以在第一个属性组中添加wix项目(.wixproj)中的属性(您可以根据自己的喜好设置日期和/或时间格式):
<Date>$([System.DateTime]::Now.ToString("yyyyMMddhhmm"))</Date>
然后在您的配置中,属性组在<DefineConstants>
中添加此属性,如果您有更多常量,则用分号;
分隔它们:
<DefineConstants>Date=$(Date)</DefineConstants>
最后添加MSI属性:
<Property Id="BuildDate" Value="$(var.Date)" />
答案 1 :(得分:1)
尝试使用全部大写 DATE
,如下所示:
<Property Name="BuildDate" Value="$(env.DATE)" />
UPDATE :我的初步猜测不正确 - 以这种方式引用时,环境变量不区分大小写。
似乎它取决于环境变量的类型。有标准的环境变量,如%TEMP%
,%windir%
等。这些变量是“静态的”,意味着每次引用时都不会计算该值。
有动态环境变量,每次引用时都会计算出来。这些包括%DATE%
,%TIME%
等。似乎WiX预处理器无法使用动态变量。您可以对此进行验证:放置$(env.windir)
它会起作用,放置$(env.time)
- 但它不会。有关环境变量的更多信息可以在here找到。
我还没有验证WiX错误数据库是否有希望支持这一点。随意自己做。
所以,回到你的问题。您可以通过以下方式解决此限制:
可以找到如何创建预处理器扩展的示例here。
以下是完成工作的代码示例:
public class DateExtension : PreprocessorExtension
{
public override string[] Prefixes
{
get
{
return new[] { "date" };
}
}
public override string GetVariableValue(string prefix, string name)
{
string result = null;
switch (prefix)
{
case "date":
switch (name)
{
case "Now":
result = DateTime.Now.ToShortDateString();
break;
}
break;
}
return result;
}
}
在您的WiX代码中,您可以通过以下方式使用它:
<Property Id="BuildDate" Value="$(date.Now)" />
不要忘记:
-ext path/to/PreprocessorExtension.dll
)[assembly: AssemblyDefaultWixExtension(typeof(PreprocessorWixExtension))]
添加到预处理器扩展项目以下是我在MSI包中观察到的结果:
答案 2 :(得分:0)
要从其他属性设置属性值,请使用以下语法:
<SetProperty Id="BuildDate" Value="[Date]" After="InstallInitialize" />