Каркас установщика Qt отменяет операции Mkdir

Я использую структуру установщика qt для создания установщика. На этапе установки я вызвал component.addOperation("Mkdir", dataDir); // dataDir is a dataLocationDir like C:\Users\Stranger\AppData\Local\MyAppName Когда моя установленная программа заработала, она поместила некоторые папки и файлы в dataLocationDir, таким образом, шаг UNDO операции «Mkdir» не работает правильно, когда я запускаю удаление. Я пытаюсь использовать команду «Выполнить» следующим образом: 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' (программа не определена)»


person Leonid Leshukov    schedule 18.11.2016    source источник
comment
Некоторый прогресс, но он все еще не работает. Теперь я пишу: ‹code›component.addOperation(Execute, cmd, /C, mkdir, dataDir, UNDOEXECUTE, cmd, /C, rmdir, /S, /Q, dataDir);‹/code›. Но он возвращает сообщение об ошибке Execution failed (неожиданный код выхода 1): cmd /C mkdir C:\User\Staranger\AppData\Local\MyPath   -  person Leonid Leshukov    schedule 21.11.2016


Ответы (3)


Вы сказали, что пробовали оба

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», и он будет работать, как задумано. Во всяком случае, я протестировал и использовал решение, которое я предлагаю. Если это не сработает, убедитесь, что вы правильно экранируете обратную косую черту на своем пути.

person Saucistophe    schedule 18.01.2017

Я столкнулся с той же проблемой.

Короче говоря, похоже, что операции над каталогами QtIFW глючат.

Под Windows я решил таким образом:

  1. Я создал пакетный файл, который управляет входным аргументом «добавить» во время установки и входным аргументом «удалить» во время удаления.
  2. Я поместил его в файл ресурсов установщика.
  3. В конструкторе компонента я перемещаю этот скрипт в каталог установки:

    installer.performOperation("Копировать", ["://myfile.bat", installer.value("TargetDir")]);

  4. В createOperations компонента есть:

    component.addOperation("Выполнить", ["cmd", "/c", "@TargetDir@\\myfile.bat", "добавить", "workingDirectory=@TargetDir@", "UNDOEXECUTE", "cmd", " /c", "@TargetDir@\\myfile.bat", "удалить", "workingDirectory=@TargetDir@"]);

  5. В FinishPageCallback контроллера я удаляю пакет следующим образом:

    installer.performOperation("Удалить", installer.value("TargetDir") + "\\myfile.bat"));

person sassi67    schedule 25.01.2018

Это ошибка установщика в работе операция Мкдир.

Я обошел это с помощью скрипта контроллера.

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);
    }
person Roman Nikishin    schedule 06.03.2018