2016-12-21 7 views
1

Я хочу, чтобы создал пакетный файл и запустил его после завершения установки. Я нашел учебник здесь: https://www.codeproject.com/questions/477984/createplusandpluswriteplusbatchplusfileplusinplusiInno Setup: как создать командный файл и запустить его после завершения установки

Так что я начал набирать эту кучу кода здесь в моей секции [Code]:

function CreateInstallDatabaseBatch(): boolean; 
var 
    fileName: string; 
    line: string; 
begin 
    Result:= True; 
    fileName:= ExpandConstant('{sd}\{#MyAppName}\Temp\installdatabase.bat'); 
    line:= 'sqlcmd -S ' + srvName + ' -i {sd}\{#MyAppName}\Temp\installdatabase.sql'; 
    Result:= SaveStringToFile(fileName, line, true); 
    exit; 
end; 

procedure installdb(CurStep: TSetupStep); 
begin 
    if CurStep=ssDone then 
    begin 
    CreateInstallDatabaseBatch(); 
    end; 
end; 

Он компилируется без каких-либо ошибок и установить мой пакет без каких-либо ошибок, но не создает пакетный файл с одной строкой. Должен ли я что-то добавить? Я просто добавил части кода, которые показаны в учебнике, и немного отредактировал их (т. Е. Мне нужна только одна строка, а не строки).

Если вам нужна дополнительная информация, сообщите мне. Ответьте как можно скорее.

ответ

1
  1. The CurStepChanged из original code является Inno Setup event function. Вы не можете переименовать его.

  2. Убедитесь, что существует {sd}\{#MyAppName}\Temp. Почему бы вам не использовать временную папку установщика ({tmp})?

  3. Вы должны использовать ExpandConstant function, чтобы развернуть константу {sd} в {sd}\{#MyAppName}\Temp\installdatabase.sql (как и путь к пакетному файлу). Вам лучше поместить путь в двойные кавычки.

  4. Для одной команды вам не нужно создавать командный файл. Просто запустите команду непосредственно с помощью ShellExec function:

procedure CurStepChanged(CurStep: TSetupStep); 
var 
    Params: string; 
    ErrorCode: Integer; 
begin 
    if CurStep = ssDone then 
    begin 
    Params := 
     '-S ' + srvName + ' ' + 
     '-i "' + ExpandConstant('{sd}\{#MyAppName}\Temp\installdatabase.sql') + '"'; 
    ShellExec('', 'sqlcmd', Params, '', SW_SHOW, ewWaitUntilTerminated, ErrorCode); 
    end; 
end; 
+0

Я пытался сделать это, как вы сказали, в шаге 4, потому что мне просто нужно выполнить одну команду. Чтобы проверить правильность строки «Params», я использовал MsgBox. Следующая проблема: переменная srvName объявляется и привязывается к значению в другой процедуре (InitializeWizard). Его имя сервера, которое пользователь должен ввести в поле ввода. Как я это сделал: 'srvName: = ServerDataPage.Values ​​[1]' – aliimagnito

+0

* Но имя не отображается. Какие-либо предложения? – aliimagnito

+0

Вы не можете выполнить 'srvName: = ServerDataPage.Values ​​[1]' в 'InitializeWizard'. В этот момент коробка еще не имеет значения! Используйте 'ServerDataPage.Values ​​[1]' непосредственно в 'CurStepChanged', вместо переменной' srvName'. Как '' -S '+ ServerDataPage.Values ​​[1] +' '+ '. –