0

我使用 qt 安装程序框架来创建安装程序。在安装步骤中,我调用 component.addOperation("Mkdir", dataDir); // dataDir is a dataLocationDir like C:\Users\Stranger\AppData\Local\MyAppName 了当我安装的程序运行时,它会将一些文件夹和文件放入 dataLocationDir 中,这样,当我运行卸载时,“Mkdir”操作的 UNDO 步骤无法正常工作。我尝试像这样使用“执行”命令: component.addOperation("Execute", "mkdir " + dataDir, "UNDOEXECUTE", "del /S /F" + dataDir); 我也尝试过 component.addOperation("Execute", "cmd /C mkdir " + dataDir, "UNDOEXECUTE", "cmd /C del /S /F" + dataDir); ,但是这种方法取消并出现错误“无法启动:'mkdir my/path'(未定义程序)”

4

3 回答 3

0

我遇到了同样的问题。

简而言之,看起来对 QtIFW 目录的操作是错误的。

在 Windows 下我是这样解决的:

  1. 我创建了一个批处理文件,它在安装期间管理输入参数“add”,在卸载期间管理输入参数“delete”。
  2. 我已经把它放在安装程序的资源文件中。
  3. 在组件的构造函数中,我将此脚本移动到安装目录:

    installer.performOperation("复制", ["://myfile.bat", installer.value("TargetDir")]);

  4. 在组件的 createOperations 中有:

    component.addOperation("执行", ["cmd", "/c", "@TargetDir@\\myfile.bat", "add", "workingDirectory=@TargetDir@", "UNDOEXECUTE", "cmd", " /c", "@TargetDir@\\myfile.bat", "删除", "workingDirectory=@TargetDir@"]);

  5. 在 Controller 的 finishPageCallback 中,我以这种方式删除批处理:

    installer.performOperation("删除", installer.value("TargetDir") + "\\myfile.bat"));

于 2018-01-25T14:39:59.073 回答
0

你说你都试过了

component.addOperation("Execute", "mkdir " + dataDir, "UNDOEXECUTE", "del /S /F" + dataDir);

component.addOperation("Execute", "cmd", "/C", "mkdir", dataDir, "UNDOEXECUTE", "cmd ", "/C", "rmdir", "/S", /Q", dataDir);

我认为正确的方法是第一个,第二个的语法:

component.addOperation("Execute", "mkdir", dataDir, "UNDOEXECUTE", "del", "/S", "/F", dataDir);

第一个不起作用,因为您必须将可执行文件与参数分开。如果 Qt 得到一个字符串,它假定它是您的可执行完整路径。第二个实际上应该可以工作,因为您可以运行(例如在 cmd 中)“cmd /c mkdir yourPath”并且它可以按预期工作。无论如何,我已经测试并使用了我提出的解决方案。如果它不起作用,请确保在路径中正确转义反斜杠。

于 2017-01-18T11:12:22.667 回答
0

这是Mkdir 操作中的安装程序错误。

我使用控制器脚本解决了这个问题。

Controller.prototype.FinishedPageCallback = function()
{
    if (installer.isUninstaller() && installer.status == QInstaller.Success) {

        var pathToconfigMyapp = QDesktopServices.storageLocation(QDesktopServices.GenericDataLocation) + "\\Myapp";


        if(installer.fileExists(pathToconfigMyapp) === true){
            installer.executeDetached("cmd",["/c", "rd", "/q", "/s", pathToconfigMyapp]);
        }

        gui.clickButton(buttons.FinishButton);
    }
于 2018-03-06T15:10:56.193 回答