Как вызвать внешнюю программу с параметрами?
Я хотел бы вызвать программу windows в моем коде с параметрами, определенными внутри самого кода.
Я не хочу вызывать внешнюю функцию или метод, но фактический файл .exe или batch/ script в среде WinXP.
C или С++ - предпочтительный язык, но если это легче сделать на любом другом языке, дайте мне знать (ASM, С#, Python и т.д.).
Ответы
Ответ 1
Когда вы вызываете CreateProcess(), System() и т.д., удостоверьтесь, что вы дважды указываете строки имени файла (включая имя файла командной программы), если ваши имена файлов и/или полный путь имеют пробелы в противном случае части пути имени файла будут разбираться интерпретатором команд в виде отдельных аргументов.
system("\"d:some path\\program.exe\" \"d:\\other path\\file name.ext\"");
Для Windows рекомендуется использовать CreateProcess(). У этого есть более грязная настройка, но у вас больше контроля над тем, как запускаются процессы (как описано Грегом Хьюджиллом). Для быстрого и грязного вы также можете использовать WinExec().
(system() переносится в UNIX).
При запуске пакетных файлов вам может потребоваться запустить с помощью cmd.exe(или command.com).
WinExec("cmd \"d:some path\\program.bat\" \"d:\\other path\\file name.ext\"",SW_SHOW_MINIMIZED);
(или SW_SHOW_NORMAL
, если вы хотите отобразить окно командной строки).
Windows должна найти command.com или cmd.exe в системе PATH, поэтому внутри не нужно быть полностью квалифицированным, но если вы хотите быть уверенным, вы можете составить полное имя файла, используя CSIDL_SYSTEM
(не просто используйте C:\Windows\system32\cmd.exe).
Ответ 2
Я думаю, что вы ищете функцию CreateProcess в Windows API. На самом деле есть семейство связанных звонков, но это поможет вам начать. Это довольно легко.
Ответ 3
Пример С++:
char temp[512];
sprintf(temp, "command -%s -%s", parameter1, parameter2);
system((char *)temp);
Пример С#:
private static void RunCommandExample()
{
// Don't forget using System.Diagnostics
Process myProcess = new Process();
try
{
myProcess.StartInfo.FileName = "executabletorun.exe";
//Do not receive an event when the process exits.
myProcess.EnableRaisingEvents = false;
// Parameters
myProcess.StartInfo.Arguments = "/user testuser /otherparam ok";
// Modify the following to hide / show the window
myProcess.StartInfo.CreateNoWindow = false;
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
myProcess.Start();
}
catch (Exception e)
{
// Handle error here
}
}
Ответ 4
Один из простейших способов сделать это - использовать функцию библиотеки system()
. В качестве параметра требуется одна строка (гораздо меньше параметров, чем CreateProcess
!), И выполняет ее, как если бы она была введена в командной строке. system()
также автоматически ожидает завершения процесса до его возврата.
Существуют также ограничения:
- у вас меньше контроля над stdin и stdout запущенного процесса.
- вы не можете ничего делать, пока другой процесс запущен (например, решение убить его)
- вы не можете получить обращение к другому процессу, чтобы запросить его каким-либо образом.
Библиотека времени исполнения также предоставляет семейство функций exec*
(execl
, execlp
, execle
, execv
, execvp
, более или менее), которые получены из наследия Unix и предлагают больше контроля над процессом.
На самом низком уровне на Win32 все процессы запускаются функцией CreateProcess
, что дает вам максимальную гибкость.