【问题标题】:Open text file after MSI install安装 MSI 后打开文本文件
【发布时间】:2013-04-17 10:06:41
【问题描述】:

我一直在关注在 MSI 安装结束时添加复选框以打开已安装产品的解决方案:
Run exe after msi installation?

到目前为止,一切都很好。 但是,我想添加另一个复选框,用于打开一个包含发行说明的简单文本文件。该文件已与主输出一起包含在安装项目中。我可以添加一个新的复选框。唯一的问题是如何打开该文本文件:我在这里看到的似乎没有自定义操作适合此需求: http://msdn.microsoft.com/en-us/library/windows/desktop/aa372048%28v=vs.85%29.aspx

这是我当前的 JS 代码:

var sql
var view
var checkboxTextForReleaseNotes = "See release notes";
var fileReleaseNotes = "ReleaseNotes.txt";

try
{
    var fileIdForReleaseNotes = FindFileIdentifier(database, fileReleaseNotes);
    if (!fileIdForReleaseNotes)
        throw "Unable to find '" + fileReleaseNotes + "' in File table";

    [ ... some actions to include another control as seen in link above ... ]

    // Insert the new CheckboxReleaseNotes control
    sql = "INSERT INTO `Control` (`Dialog_`, `Control`, `Type`, `X`, `Y`, `Width`, `Height`, `Attributes`, `Property`, `Text`, `Control_Next`, `Help`) VALUES ('FinishedForm', 'CheckboxReleaseNotes', 'CheckBox', '18', '140', '343', '12', '3', 'LAUNCH_RN', '{\\VSI_MS_Sans_Serif13.0_0_0}" + checkboxTextForReleaseNotes + "', 'CloseButton', '|')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    // Modify the Order of the EndDialog event of the FinishedForm to 1
    sql = "SELECT `Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering` FROM `ControlEvent` WHERE `Dialog_`='FinishedForm' AND `Event`='EndDialog'";
    view = database.OpenView(sql);
    view.Execute();
    record = view.Fetch();
    record.IntegerData(6) = 1;
    view.Modify(msiViewModifyReplace, record);
    view.Close();

    // Insert the Event to launch the release notes
    sql = "INSERT INTO `ControlEvent` (`Dialog_`, `Control_`, `Event`, `Argument`, `Condition`, `Ordering`) VALUES ('FinishedForm', 'CloseButton', 'DoAction', 'OPEN_RN', 'LAUNCH_RN=1', '0')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    // Insert the custom action to open the release notes when finished
    sql = "INSERT INTO `CustomAction` (`Action`, `Type`, `Source`, `Target`) VALUES ('OPEN_RN', '210', '" + fileIdForReleaseNotes + "', '')";
    view = database.OpenView(sql);
    view.Execute();
    view.Close();

    database.Commit();
}
catch (e)
{
    WScript.StdErr.WriteLine(e);
    WScript.Quit(1);
}

我知道自定义操作的类型“210”不是正确的...但是有吗?还是我真的必须通过启动 Jscript 或 VBScript 来解决问题?

编辑:代码结束。还尝试通过“vdproj”属性添加自定义操作,但由于文件不兼容而被拒绝。

【问题讨论】:

    标签: visual-studio-2010 windows-installer setup-project custom-action


    【解决方案1】:

    以下所有内容均未经测试。

    我认为您希望 custom action type 34msidbCustomActionTypeAsync + msidbCustomActionTypeContinue 以 ASync/NoWait 运行它。所以自定义动作类型34+192=226。

    Source,根据文档,不必与目标可执行文件位于同一目录。

    Target 是...

    CustomAction 表的 Target 列包含可执行文件的完整路径和名称,后跟可执行文件的可选参数。可执行文件的完整路径和名称是必需的。长文件名或路径必须使用引号。该值被视为格式化文本,可能包含对属性、文件、目录或其他格式化文本属性的引用。

    您可以使用"start" shell command 通过shell 加载文本文件。这将使用用户的默认文本文件查看器打开文本文件。您需要 start.exe 的完整路径和发行说明的完整路径。请注意文档如何说它将在 Target 字段上进行字符串替换。 There's a string format 在给定 File 表键的情况下获取文件的完整路径。

    如果找到 [#filekey] 形式的子字符串,则将其替换为文件的完整路径,并将值 filekey 用作文件表的键。

    综上所述,以下可能适用于Target

    "[SystemFolder]start.exe" "[#someFileKey]"
    

    话虽如此,如果您要执行更多这些自定义操作,我真的会研究Wix 并编写您自己的自定义操作。 Wix 将使您免于运行此 javascript 后期构建。创作您自己的自定义操作可让您直接访问 .NET 或 Windows API。例如,在 C# 中使用 shell 打开文件是pretty straight forward

    【讨论】:

    • 确实,WiX 提供了更多的可能性,但为了线程的缘故,我将尝试完成这一点。如果我理解正确,sql 查询应该如下所示,但不起作用(虽然没有弹出错误):sql = "INSERT INTO ``CustomAction`` (``Action``, ``Type``, ``Source``, ``Target``) VALUES ('OPEN_RN', '226', '', '\"[System]start.exe\" \"[#" + fileIdForReleaseNotes + "]\"')"; 但我不确定来源:可以为空吗?
    • 糟糕,这是 [SystemFolder] 而不是 [System]。我从here 得到这些值。文档说它忽略了 Source。也许将 [SystemFolder] 留在那里,看看它是否会改变?确保您的 fileIdForReleaseNotes 是正确的。在 Orca 中打开 .MSI 并查看文件表。您想要的是 File 列中的值。
    • 您可能还会被 [#filekey] 的这部分文档击中:“[#filekey] 的值保持空白,并且在安装程序运行 CostInitialize 操作之前不会被路径替换、FileCost 操作和 CostFinalize 操作。"
    • 甚至没有明确的完整路径工作:我尝试了以下简单值但仍然无法打开。 ... VALUES ('OPEN_RN', '226', '', '\"C:\\Windows\\notepad.exe\" \"C:\\ReleaseNotes.txt\"') 另外,我在干扰的情况下禁用了另一个复选框,所以我只使用这个复选框进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多