Я пытаюсь установить SQL Server 2012
с помощью inno setup
. Установочная часть работает нормально. Я использую настраиваемый порт для установки SQL-сервера, поэтому я меняю номер порта в Windows Registry
после установки с помощью RegWriteStringValue
и пытаюсь перезапустить службу SQL Server, чтобы изменения вступили в силу.
Но по какой-то причине моя логика перезапуска службы не работает через мой код. Я использую описанную ниже процедуру, чтобы добиться того же.
procedure RestartService;
var
CommandLine: String;
MyResultCode: Integer;
begin
CommandLine := 'cmd /c NET STOP MSSQLSERVER /y < "C:\test\yes.txt" & NET START SQLSERVERAGENT > C:\test\Output.txt';
Log('Command line is.. ' + CommandLine);
Exec('cmd.exe', CommandLine, '', SW_HIDE, ewWaitUntilTerminated, MyResultCode);
Sleep(20000);
end;
Файл yes.txt
содержит символ Y и новую строку, поскольку для перезапуска службы требуется запрос на перезапуск зависимой службы.
Когда я открываю командную строку и запускаю команду напрямую в CommandLine, она работает отлично и дает мне следующий результат.
The following services are dependent on the SQL Server (MSSQLSERVER) service.
Stopping the SQL Server (MSSQLSERVER) service will also stop these services.
SQL Server Agent (MSSQLSERVER)
The SQL Server Agent (MSSQLSERVER) service is stopping.
The SQL Server Agent (MSSQLSERVER) service was stopped successfully.
The SQL Server (MSSQLSERVER) service is stopping.
The SQL Server (MSSQLSERVER) service was stopped successfully.
Но из программы он, похоже, не работает и возвращает MyResultCode
как 1, а также файл Output.txt
, который записывает вывод после выполнения команды, пуст. Что мне не хватает?
Заранее спасибо, Диджей.
А затем замените /C
на /K
, как показывает ответ на связанный вопрос. И замените SW_HIDE
на SW_SHOW
.
Что означает /K
? Кроме того, поскольку повторение cmd
в командной строке работало нормально, я предполагал, что он будет работать. Построим и проверим, решат ли ваши предложения проблему.
Связанный вопрос объясняет, что делает /K
.
Спасибо, Мартин, /K
помог мне найти проблему. Файл yes.txt
не был создан, поэтому команда не выполнена.
Вам не нужен файл для ввода команды, используйте echo
, например: cmd /c echo yes|NET STOP MSSQLSERVER /y
- Хотя для чего вам нужен yes.txt
? Разве /y
не служит той же цели?
Большое спасибо. Я не знал этого раньше. Это именно то, что я ищу.
Вы повторяете
cmd
в командной строкеcmd
. Это должен бытьCommandLine := '/c ...'
.