Я не нашел реального решения , поэтому я сделал это вместо этого ...
По сути, мой обходной путь - создать необработанное исключение и записать файл журнала ошибок в разделе «exit».на провал "условия.Наличие журнала указывает на возникшую проблему.Если такого журнала нет, то установка прошла успешно.Если вы заботитесь только о прохождении / сбое, просто проверьте существование файла.Еще, прочитайте файл для деталей.
В моем решении я разрешаю клиенту передать аргумент установщику, указав конкретный путь / имя для журнала ошибок.Если это не предусмотрено, он записывает путь по умолчанию во временный каталог.
Обратите внимание, что, если я не ошибаюсь, я не вижу средств для прямой записи файлов, их удаления или разрешения временных путей.прямо в сценарии QtIFW.Итак, я просто использую операции с оболочкой.Используя их, я возвращаю обратно разрешения путей из оболочки, тем самым неявно разрешая использование переменных среды в пути к файлу.
- Вставьте следующее в ваш QtIFW QScript:
Это полное Windows специальное решение:
function clearErrorLog() {
var path = installer.value( "errlog", "%temp%\\installer.err" );
var deleteCmd = "echo off && del \"" + path + "\" /q\necho " + path + "\n";
var result = installer.execute( "cmd.exe", ["/k"], deleteCmd );
if( result[1] != 0 )
throw new Error("Clear error log failed.");
try{
var cmdOutLns = result[0].split("\n");
path = cmdOutLns[cmdOutLns.length-2].trim();
}
catch(e){ path = ""; }
if( path=="" || installer.fileExists( path ) )
throw new Error("Clear error log failed. (file exists)");
console.log("Cleared error log: " + path);
}
function writeErrorLog( msg ) {
var path = installer.value( "errlog", "%temp%\\installer.err" );
var writeCmd = "echo off && echo " + msg + " > \"" + path + "\"\necho " + path + "\n";
var result = installer.execute( "cmd.exe", ["/k"], writeCmd );
if( result[1] != 0 )
throw new Error("Write error log failed.");
try{
var cmdOutLns = result[0].split("\n");
path = cmdOutLns[cmdOutLns.length-2].trim();
}
catch(e){ path = ""; }
if( path=="" || !installer.fileExists( path ) )
throw new Error("Write error log failed. (file does not exists)");
console.log("Wrote error log to: " + path);
}
function silentAbort( msg ) {
writeErrorLog( msg );
throw new Error( msg );
}
При запуске сценария очистите журнал.
function Controller() {
clearErrorLog();
...
}
- Для macOS или Linux (большинство дистрибутивов должно быть по крайней мере счастливым):
Заменить первые строки в clearErrorLog()
на:
var path = installer.value( "errlog", "/tmp/installer.err" );
var deleteCmd = "rm \"" + path + "\";echo " + path;
var result = installer.execute( "sh", ["-c", deleteCmd] );
И заменить первые строки в writeErrorLog()
на:
var path = installer.value( "errlog", "/tmp/installer.err" );
var writeCmd = "echo " + msg + " > \"" + path + "\";echo " + path;
var result = installer.execute( "sh", ["-c", writeCmd] );
Если вы хотите проверить платформу, systemInfo.kernelType
вернет "winnt"
, "linux"
или "darwin"
(для macOS) среди других возможных значений.
- Если вы хотите вызвать механизм, вызовите
silentAbort( msg )
.
В сценариях QtIWF нет главного обработчика исключений или чего-либо еще, поэтому, если у вас нет этой функции silentAbort, вложенной в блок try, исключение эффективно немедленно завершит работу программы.
Чтобы явно указать, какой путь использовать, запустите установщик с ключом "errlog" в качестве аргумента, подобного этому: myinstaller.exe errlog=mylog.err
.Если вы не укажете полный путь, будет использован текущий рабочий каталог.
Вы можете удалить журнал, если хотите.Конечно же, довольно часто можно оставлять мусор в каталоге temp (не то, чтобы я действительно был фанатом этого ...).