但是如果你需要在postUninstall時刻運行批處理文件呢?在這種情況下,恢復由應用程序更改的數據庫文件的備份?
我花了幾個小時嘗試一切,直到我發現這個黑客。
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
ResultCode: Integer;
outfile: String;
runBatHeader: String;
runBatBody: String;
begin
if CurUninstallStep = usPostUninstall then
begin
(*
This is a messy hack, but the only way I could find to run a bat file
during the post unistall section. In this case all files copied are
already removed, and it was not permitted to extract temp files in
the uninstall phase. Code here writes 'outfile' to a system folder then runs it.
*)
if DirExists('C:\ProgramData\MySQL\MySQL Server 5.7_bak') then begin
if MsgBox('Uninstall located a possible backup of your original MySQL tables. ' +
'Uninstall can attempt to copy it to the previous location. There is no ' +
'guarantee that it will succeed. Do you want to try restoring this folder?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then
begin
outFile := 'C:\ProgramData\MySQL\restore.bat';
runBatHeader := '@echo off' + #13#10 + #13#10;
runBatBody := 'ECHO Attempt to stop MySQL57' + #13#10 +
'NET STOP MySQL57' + #13#10 +
'ECHO Removing application databases' + #13#10 +
'RMDIR /S /Q "C:\ProgramData\MySQL\MySQL Server 5.7\"' + #13#10 +
'ECHO Copying backup to original location' + #13#10 +
'XCOPY "C:\ProgramData\MySQL\MySQL Server 5.7_bak" "C:\ProgramData\MySQL\MySQL Server 5.7\" /C /E /H /I /K /O /Q /R /Y' + #13#10 + #13#10 +
'ECHO Try to start MySQL57' + #13#10 +
'NET START MySQL57';';
SaveStringToFile(outFile, runBatHeader, False);
SaveStringToFile(outFile, runBatBody, True);
MsgBox('ShelExec : C:\ProgramData\MySQL\restore.bat', mbConfirmation, MB_OK);
if not ShellExec('', 'C:\ProgramData\MySQL\restore.bat', '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
begin
// handle failure if necessary
MsgBox('Apparently, the administrative privilege was not operational. Exiting without restoring the backup. ('+ IntToStr(ResultCode) +')', mbConfirmation, MB_OK);
end;
DeleteFile(outfile);
end;
end;
end;
end;
雖然這不是我的想法。我發現一個example here。
最好的辦法是將批處理文件中的任何內容重寫到Inno代碼中。代碼可以完成批處理文件可以執行的任何操作,等等。 – Miral 2013-05-08 20:47:25
@Miral - 我不確定如何使用Inno Setup刪除文件並啓動和停止服務。結果,我不得不使用批處理文件。 – John 2013-05-08 21:16:35