» работа с командной строкой в delphi. winexec
В этом небольшом уроке мы рассмотрим работу с командной строкой в Delphi.
Непосредственно передачу команд в командую строку операционной системы Windows в Delphi помогает реализовать процедура WinExec. Вообще, WinExec позволяет обращаться к любым исполняемым файлам с возможностью передачи им каких-либо параметров. В качестве самого примитивного примера использования этой процедуры можно привести запуск калькулятора Windows:
[cc lang=»delphi»]WinExec(PAnsiChar(‘calc.exe’), SW_SHOWNORMAL);[/cc]Рассмотрим параметры, которые необходимо передавать WinExec:
- Команда, которая будет выполнена. Т.е. здесь мы можем указать, например, какой-либо файл, который необходимо запустить. Тип этого параметра — PAnsiChar, а соответственно строки можно передавать только приводя их к типу PAnsiChar.
- Параметр, характеризующий способ отображения открываемого окна. Если указать SW_SHOWNORMAL, то открываемое окно будет отображено по-умолчанию, а если укажем SW_HIDE, то окно будет скрыто, что бывает удобно использовать при обращении к командной строке, т.к. отображать ее на долю секунды нет никакого смысла.
Теперь научимся обращаться к командной строке, используя процедуру WinExec. Рассмотрим несложный пример:
[cc lang=»delphi»]WinExec(PAnsiChar(‘cmd /c md f:t’), SW_HIDE);[/cc]Как вы видите, мы указали SW_HIDE, чтобы не отображать окно консоли. Обратим внимание на формирование самой команды.
- Сначала мы указываем «cmd», что говорит о том, что мы запустим командную строку.
- Затем мы указываем «/c», для того чтобы, после выполнения команды, наша командная строка закрылась.
- Ну а далее идет сама операция для командной строки — «md f:t». Эта команда создает папку «t» на диске «f:».
Для того, чтобы выполнить несколько команд последовательно, можно использовать символ «&», которым мы можем разделить несколько различных команд для последовательного выполнения.
[cc lang=»delphi»]WinExec(PAnsiChar(‘cmd /c md f:t&md f:t1’), SW_HIDE);[/cc]Небольшой пример компиляции исходного dpr файла Delphi посредством командной строки:
[cc lang=»delphi»]procedure CompileDelphiCode(filename: string);
var
c: ansistring;
begin
c := ‘cmd /c dcc32 -b -q -h- -w- «‘ filename ‘»‘;
WinExec(PAnsiChar(c), SW_Hide);
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
CompileDelphiCode(‘f:t.dpr’);
end;[/cc]Этой процедуре необходимо передать единственный параметр — абсолютный или относительный путь до исходного dpr файла. В результате будет запущен компилятор Delphi «dcc32», который скомпилирует исходный код в папку с указанным dpr файлом. Если у вас возникли проблемы с тем, что командная строка не знает, что такое dcc32, то укажите вместо dcc32 абсолютный путь до самого компилятора, который лежит в папке с вашей средой Delphi в папке bin и называется «dcc32.exe».
Работа с командной строкой в C#
Исполнение команд в командной строке из delphi
ларчик просто открывается
ShellExecute(0,nil,’cmd.exe’,’/c код из бат-файла’,nil,SW_SHOWNORMAL) и не будет работать
проблема в коде. вы указали просто java, а надо java.exe. Это момент первый. Второй момент. Лучше такие строки выполнения загонять в строковую переменную, а уже ее применить в Shellexecute. Ну и третье. Зачем вы обращаетесь к командной строке, если у вас есть своя команда для выполнения?
попробуйте так
…
var optionstring,startprogram:string;
…
begin
startprogram:=’E:Program FilesJavajre6binjava.exe’;
optionstring:=’-Xms8192m -Xmx8192m -cp “%APPDATA%.minecraftbin*” -Djava.library.path=”%APPDATA%.minecraftbinnatives” net.minecraft.client.Minecraft “HoShiMin”‘;
ShellExecute(0,nil,pchar(startprogram),pchar(optionstring),nil,SW_SHOWNORMAL);
попробуйте так, и не забудьте в user ShellApi добавить.
https://office-study.xyz
Как получить результат выполнения командной строки
Jetus ©
(2005-01-28 10:49)
[0]
Помогите, мастера! Ситуация: я выполняю функцией WinExec() некоторые команды командной строки Windows XP, например:
WinExec(“cmd /c SystemInfo”, 1);
В результате данная командная строка выводит кучу полезных даных о компе.
Как получить эти данные в своей программе и поместить их, например, в Мемо?
← →
Erik1 ©
(2005-01-28 10:57)
[1]
WinExec тебе неподойдет, это устаревшая функция. CreateProcess тебе нужен. Зайди на королевство Delphi там была статья с примером как это сделать, использовались pipe.
← →
Kerk ©
(2005-01-28 11:02)
[2]
Erik1 © (28.01.05 10:57) [1]
пусть зайдет в винапи, где он то же самое спросил 🙂
← →
MInd_f ©
(2005-01-28 11:29)
[3]
Напиши так:
WinExec(“cmd /c SystemInfo>>C:Infa.txt”, 1);
и загружай данные из файла
← →
Kerk ©
(2005-01-28 11:40)
[4]
MInd_f © (28.01.05 11:29) [3]WinExec(“cmd /c SystemInfo>>C:Infa.txt”, 1);
убивать за такое надо 🙂
← →
Smileman
(2005-01-28 13:14)
[5]
я ниче не понял
Выполнение команды dos и получение вывода
Совет от Joe Donth как запустить и получить результат команды DOS, используя cmd.exe
(только в системах NT).
Это работает, выполняя cmd.exe
с командой, которая будет выполнена с переданным в командной строке каталогом. Команда выполняется, а вывод возвращается как строка.
function GetDosOutput(
CommandLine: string; Work: string = 'C:'): string;
var
SA: TSecurityAttributes;
SI: TStartupInfo;
PI: TProcessInformation;
StdOutPipeRead, StdOutPipeWrite: THandle;
WasOK: Boolean;
Buffer: array[0..255] of Char;
BytesRead: Cardinal;
WorkDir: string;
Handle: Boolean;
begin
Result := '';
with SA do begin
nLength := SizeOf(SA);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
try
with SI do
begin
FillChar(SI, SizeOf(SI), 0);
cb := SizeOf(SI);
dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
wShowWindow := SW_HIDE;
hStdInput := GetStdHandle(
STD_INPUT_HANDLE); // не переадресовывать stdinput
hStdOutput := StdOutPipeWrite;
hStdError := StdOutPipeWrite;
end;
WorkDir := Work;
Handle := CreateProcess(nil, PChar('cmd.exe /C ' CommandLine),
nil, nil, True, 0, nil,
PChar(WorkDir), SI, PI);
CloseHandle(StdOutPipeWrite);
if Handle then
try
repeat
WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
if BytesRead > 0 then
begin
Buffer[BytesRead] := #0;
Result := Result Buffer;
end;
until not WasOK or (BytesRead = 0);
WaitForSingleObject(PI.hProcess, INFINITE);
finally
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
finally
CloseHandle(StdOutPipeRead);
end;
end;
Чтобы проверить это, поместите TMemo, TEdit и TButton на форму.
Напишите обработчик события кнопки как показано ниже:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text := GetDosOutput(Edit1.Text);
end;
Введите требуемую команду в поле редактирования, например Help DIR
, и щелкните кнопку, чтобы отобразить вывод в управлении Memo.