Почему не отрабатывает батник?

@Александр85, с помощью функций IsTaskSelected или IsComponentSelected, смотря через что у вас задача реализована. Примеров использования функций полно в интернете, но в справке это все есть.
 
Подскажите, кто-нибудь, как тогда, как "по-тихому", запустить стандартное средство очистки cleanmgr.exe, чтобы там было по максимуму галочек и без какого либо участия и отображения для пользователя?!
cleanmgr.exe /c /autoclean /setup /lowrisk setup & lowrisk на усмотрение
 
Последнее редактирование:
Можно ли отследить выполнение батника, а затем выполнить удаление его и другой папки? Или так отработает? А то у меня зависло всё после нажатия кнопки "завершить".
Пример:
code_language.pascal:
procedure CurStepChanged(CurStep: TSetupStep);
var i: integer;
begin
  if CurStep = ssDone then
  begin
    Exec(ExpandConstant('{app}\test.bat'), ' /q /norestart', '', SW_HIDE, ewWaitUntilTerminated, i);   //выполнение бат-файла
    DeleteFile(ExpandConstant('{app}\test.bat')); // Удаление файла
    DelTree(ExpandConstant('{app}\testdiru'), True, True, True); // Удаление папки
  end;
end;
 
Проверь правильность выполнения бат файла SW_SHOW, а батник можно сделать что бы удалял себя сам по выполнении. В конце батника дописать del /f /q "%~dp0start.bat"
 
Проверь правильность выполнения бат файла SW_SHOW, а батник можно сделать что бы удалял себя сам по выполнении. В конце батника дописать del /f /q "%~dp0start.bat"
Проблема в батнике устранена. С учётом вышесказанного, если я построчно сделаю (как в коде выше), то сначала выполниться батник, а затем удаление файла и папки?
 
В той очередности и будет выполнение.
То-есть, дождётся когда выполнится батник, а затем перейдёт дальше удалять? Мне главное чтоб батник не удалился до конца выполнения его содержимого. Батник довольно большой и выполняет некоторое время действия.
 
Если функция возвратит True и Wait имеет значение ewWaitUntilTerminated, тогда ResultCode содержит код выхода запущенного процесса.
Если функция возвратит False, тогда ResultCode содержит код ошибки. Чтобы получить описание ошибки, используйте SysErrorMessage(ResultCode).
 
Понять не могу, батник запускается, но текстовый файл, блокнотом или средство поумолчанию не открывает.

Exec(ExpandConstant('{app}\1.txt'),'','', SW_SHOW, ewWaitUntilTerminated, Res);

или так

Exec('{app}' + '\1.txt', '', '', SW_SHOW, ewNoWait, Res);
 
Понять не могу, батник запускается, но текстовый файл, блокнотом или средство поумолчанию не открывает.

Exec(ExpandConstant('{app}\1.txt'),'','', SW_SHOW, ewWaitUntilTerminated, Res);

или так

Exec('{app}' + '\1.txt', '', '', SW_SHOW, ewNoWait, Res);
ShellExec('open', ExpandConstant('{app}\1.txt '), '', '', SW_SHOW, ewNoWait, ErrorCode);
 
Вопрос на связанную тематику: на днях решил отказаться от выполнения команд внешнего файла Install.bat со следующей начинкой:
Форматирование (BB-код):
@echo on
::Делаем копию архива
IF NOT EXIST "Backup\data.tpk" (COPY /Y "..\data.tpk" "Backup\data.tpk") ELSE (ECHO Backup has been done already)
::Внедряем файлы в архив черех скрипт
IF EXIST "Backup\data.tpk" (quickbms.exe -w -r -r -r Tiny_Thor_TPK_script.bms "..\data.tpk" "Data_rus") ELSE (ECHO File not found data.tpk)
::Самоуничтожение
del /f /q "%~dp0Install.bat"
Отдельно проверил работу quickbms.exe через скрипт Tiny_Thor_TPK_script.bms командой в секции [Run]:
Filename: "{app}\rus\quickbms.exe"; Parameters: "-w -r -r -r Tiny_Thor_TPK_script.bms ""..\data.tpk"" ""Data_rus"""; Flags: shellexec
Вроде данная часть работает без косяков.
Далее решил проверить полную отработку команд батника через командную строку Filename: "{sys}\cmd.exe"; Parameters: "тупо_все_команды_файла_Install.bat"; WorkingDir: "{app}\rus"; Flags: shellexec (кроме самоуничтожения), то компилятор не понимает цепочку событий и глохнет на вызове quickbms.exe уже в процессе инсталляции.
Есть ли способ обеспечить правильное выполнение команд через командную строку или надо расширять возможности скрипта методом копирования файлов и их восстановления? По идее можно прикрутить расширение функций Backup через #include "SHFileOperation.iss", но здесь загвоздка в другом. Я не копирую готовый файл data.tpk в папку установки, ведь его модифицирует quickbms.exe в процессе установки с помощью Tiny_Thor_TPK_script.bms, но тем не менее оригинал надо отправить в папку Backup.
 
@Cyberworm,сам батник, если его положить в нужную папку и запустить отрабатывает нормально? При запуске через shellexec все необходимые файлы лежат на месте?
 
@Cyberworm,сам батник, если его положить в нужную папку и запустить отрабатывает нормально? При запуске через shellexec все необходимые файлы лежат на месте?

Скрипт отлично работает, если использовать Filename: "{app}\rus\Install.bat"; Parameters: "Install"; Flags: shellexec (тестовый вариант с pause, который требует участие пользователя для скриншота ниже). В конечном варианте паузы не будет, ибо я использую самоуничтожение Install.bat и Flags: runhidden
Скрипт.jpg
Поэтому я пришёл к выводу, что секция Parameters является малость кастрированной с ограниченным функционалом. Надо эту логику в секцию Code переносить и там через условие запускать записи из секции Run. То есть, примерно что-то такое:

IF NOT FILEEXISTS("Путь до бекапа data.tpk")
Run_backup()
RUN_BMS()
ENDIF;

Run_backup():
FileCopy("data.tpk" "rus\backup\data.tpk", FALSE)

Run_BMS():
Filename: "quick_bms.exe" Parameters: -w -r -r -r Tiny_Thor_TPK_script.bms ""..\data.tpk""

Как бы это всё правильно организовать?
 
Скрипт отлично работает, если использовать Filename: "{app}\rus\Install.bat"; Parameters: "Install"; Flags: shellexec (тестовый вариант с pause, который требует участие пользователя для скриншота ниже). В конечном варианте паузы не будет, ибо я использую самоуничтожение Install.bat и Flags: runhidden
Поэтому я пришёл к выводу, что секция Parameters является малость кастрированной с ограниченным функционалом. Надо эту логику в секцию Code переносить и там через условие запускать записи из секции Run. То есть, примерно что-то такое:

IF NOT FILEEXISTS("Путь до бекапа data.tpk")
Run_backup()
RUN_BMS()
ENDIF;

Run_backup():
FileCopy("data.tpk" "rus\backup\data.tpk", FALSE)

Run_BMS():
Filename: "quick_bms.exe" Parameters: -w -r -r -r Tiny_Thor_TPK_script.bms ""..\data.tpk""

Как бы это всё правильно организовать?

code_language.pascal:
[Run]
Filename: "{app}\rus\quickbms.exe"; Parameters: "-w -r -r -r Tiny_Thor_TPK_script.bms ""..\data.tpk"" ""data_rus"""; Check: RunBMS; Flags: runhidden

[Code]
function RunBMS: Boolean;
begin
  if not (FileExists(ExpandConstant('{app}\rus\Backup\data.tpk'))) then
  begin
    FileCopy(ExpandConstant('{app}\data.tpk'), ExpandConstant('{app}\rus\Backup\data.tpk'), False);
    Result := True;
  end else
  begin
    Result := False;
  end;
end;

Я так понимаю, что [Run] запускается после копирования всех файлов в папку и тогда он запустит проверку RunBMS. Тот посмотрит, если нет файла, то скопирует и запустит qickbms.exe. Если есть файл, то ничего не произойдет (типа запустили русификатор во второй раз и пытаются установить). Тут, конечно, много подводных камней и защита на дурака нужна (а есть ли файл), но это уже заморочки. Главное, что работает...
 
Назад
Сверху