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

Хамик

Старожил
@Александр85, с помощью функций IsTaskSelected или IsComponentSelected, смотря через что у вас задача реализована. Примеров использования функций полно в интернете, но в справке это все есть.
 

Crachlow

Старожил
Подскажите, кто-нибудь, как тогда, как "по-тихому", запустить стандартное средство очистки cleanmgr.exe, чтобы там было по максимуму галочек и без какого либо участия и отображения для пользователя?!
cleanmgr.exe /c /autoclean /setup /lowrisk setup & lowrisk на усмотрение
 
Последнее редактирование:

tihiy_don

Старожил
Можно ли отследить выполнение батника, а затем выполнить удаление его и другой папки? Или так отработает? А то у меня зависло всё после нажатия кнопки "завершить".
Пример:
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;
 

Crachlow

Старожил
Проверь правильность выполнения бат файла SW_SHOW, а батник можно сделать что бы удалял себя сам по выполнении. В конце батника дописать del /f /q "%~dp0start.bat"
 

tihiy_don

Старожил
Проверь правильность выполнения бат файла SW_SHOW, а батник можно сделать что бы удалял себя сам по выполнении. В конце батника дописать del /f /q "%~dp0start.bat"
Проблема в батнике устранена. С учётом вышесказанного, если я построчно сделаю (как в коде выше), то сначала выполниться батник, а затем удаление файла и папки?
 

tihiy_don

Старожил
В той очередности и будет выполнение.
То-есть, дождётся когда выполнится батник, а затем перейдёт дальше удалять? Мне главное чтоб батник не удалился до конца выполнения его содержимого. Батник довольно большой и выполняет некоторое время действия.
 

Crachlow

Старожил
Если функция возвратит True и Wait имеет значение ewWaitUntilTerminated, тогда ResultCode содержит код выхода запущенного процесса.
Если функция возвратит False, тогда ResultCode содержит код ошибки. Чтобы получить описание ошибки, используйте SysErrorMessage(ResultCode).
 

MISHAWIN

Новичок
Понять не могу, батник запускается, но текстовый файл, блокнотом или средство поумолчанию не открывает.

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

или так

Exec('{app}' + '\1.txt', '', '', SW_SHOW, ewNoWait, Res);
 

Crachlow

Старожил
Понять не могу, батник запускается, но текстовый файл, блокнотом или средство поумолчанию не открывает.

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);
 

Cyberworm

Новичок
Вопрос на связанную тематику: на днях решил отказаться от выполнения команд внешнего файла 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.
 

Shegorat

Lord of Madness
Администратор
@Cyberworm,сам батник, если его положить в нужную папку и запустить отрабатывает нормально? При запуске через shellexec все необходимые файлы лежат на месте?
 

Cyberworm

Новичок
@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""

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

Cyberworm

Новичок
Скрипт отлично работает, если использовать 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. Если есть файл, то ничего не произойдет (типа запустили русификатор во второй раз и пытаются установить). Тут, конечно, много подводных камней и защита на дурака нужна (а есть ли файл), но это уже заморочки. Главное, что работает...
 
Сверху