(под редакцией в ответ на комментарии ниже.)
Есть несколько шагов к этому: во-первых, на самом деле запустить сценарий; вторых, проверьте, если он успешно бежал (как то, что ему удалось начать новый процесс, и что этот процесс удалось.)
Часть 1, выполнив сценарий:
Чтобы запустить скрипт из приложения Delphi, используйте ShellExecuteEx
с глаголом «open
» (подробнее см. ниже в флагах.) Вы можете выполнить сам сценарий, если он связан с вашим исполняемым файлом Perl, или запустить ваш Perl exe со сценарием в качестве аргумента командной строки.
This article выглядит хорошей отправной точкой для использования этого API и его простого кузена ShellExecute
.
Функции ShellExecute[Ex]
обычно ожидают, что ваше приложение будет запускать цикл сообщений после этого. Маловероятно, что ваше приложение не будет, пока пользователь не нажмет кнопку, чтобы запустить это приложение, простаивает, но если по какой-то причине вам не понадобится передать флаг SEE_MASK_NOASYNC
. У MSDN много информации.
Часть 2, проверяя, если она выполнена успешно и преуспел в своей задаче:
Чтобы увидеть, если скрипт выполняется, вы должны получить дескриптор процесса для запущенного процесса и, если был новый процесс, проверьте код выхода. Вы должны изменить свой скрипт, чтобы вернуть ненулевой код, если его задача завершилась неудачей. (Я не знаком с Perl, так что я не могу конкретно сказать вам, как, но, как правило, это возвращаемое значение от «основной» функции или другой первой функции/запуска). Вы можете сделать это:
- Передать флаг
SEE_MASK_NOCLOSEPROCESS
на номер ShellExecuteEx
. Это заполнит член hProcess
структуры, через которую вы проходите, с дескриптором процесса, если он успешно запустил процесс (если нет, отметьте GetLastError
, чтобы узнать, почему.) Если это все, что вам нужно знать (только если оно началось, ничего если это сработает), тогда все готово.
- Дополнительно: ждать, пока процесс до конца, используя
WaitForSingleObject(YourParamStruct.hProcess, INFINITE)
(если вы получили правильный hProcess, конечно)
- вызова
GetExitCodeProcess
найти код выхода. (Проверьте, возвращает ли он STILL_ACTIVE
, и если он все еще работает, подождите и повторите попытку). Обычно для этого следует выйти с 0
. Вы должны изменить свой скрипт так, чтобы, если что-то пойдет не так, он возвращает ненулевое значение. Вы можете сделать коды такими же простыми или сложными, как вы хотите - например, вернуть 1
за любую ошибку или сделать несколько кодов разбитыми по типу ошибок. (Избегайте использования 259
, потому что это значение STILL_ACTIVE
- это может привести ваш код Delphi к бесконечному циклу, в зависимости от того, как он закодирован, думая, что он все еще ждет, чтобы получить код выхода, потому что скрипт Perl все еще работает, когда это не так.)
Ваше приложение Delphi может проверить этот код, чтобы увидеть, если сценарий Perl работал или нет, и сделать что-то в ответ, если это не удалось - войти сообщение, сообщить пользователю, и т.д.
одна вещь - вы говорите, что просто хотите знать, был ли сценарий выполнен или нет, и выше это должно предоставить это. Учитывая, что это скрипт Perl и работает в командной строке, еще одна вещь, которую вы можете захотеть сделать, это получить ее выход, либо для поиска ошибок, если вы не вернете код ошибки, либо зарегистрируете или покажете пользователю. Вы можете сделать это, запустив его через CreateProcess
и capturing the output. Из того, что вы говорите, это, вероятно, слишком много для того, что вам нужно, хотя!
Является ли это родным delphi или .NET? Что вы подразумеваете под окном unix? –
Просьба уточнить, хотите ли вы выполнить это локально или на удаленной системе, и если локально какая среда (CygWin, MSys) или какая оболочка (sh, bash, rxvt, ...) вы хотите использовать. – mghie
Дубликат http://stackoverflow.com/questions/1454501/how-do-i-run-a-command-line-program-in-delphi – mghie