delphi – Как получить текст который отдает консольное приложение? – Stack Overflow на русском

» работа с командной строкой в 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;

:/>  Что делать если Яндекс Браузер грузит процессор на 100 процентов

procedure TForm2.Button1Click(Sender: TObject);
begin
CompileDelphiCode(‘f:t.dpr’);
end;[/cc]Этой процедуре необходимо передать единственный параметр — абсолютный или относительный путь до исходного dpr файла. В результате будет запущен компилятор Delphi «dcc32», который скомпилирует исходный код в папку с указанным dpr файлом. Если у вас возникли проблемы с тем, что командная строка не знает, что такое dcc32, то укажите вместо dcc32 абсолютный путь до самого компилятора, который лежит в папке с вашей средой Delphi в папке bin и называется «dcc32.exe».
delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском

Работа с командной строкой в 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);
В результате данная командная строка выводит кучу полезных даных о компе.

Как получить эти данные в своей программе и поместить их, например, в Мемо?

delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русскомdelphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском


 
Erik1 ©
 
(2005-01-28 10:57)
[1]

WinExec тебе неподойдет, это устаревшая функция. CreateProcess тебе нужен. Зайди на королевство Delphi там была статья с примером как это сделать, использовались pipe.

:/>  Установка docker md

delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русскомdelphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском


 
Kerk ©
 
(2005-01-28 11:02)
[2]

Erik1 ©   (28.01.05 10:57) [1]

пусть зайдет в винапи, где он то же самое спросил 🙂

delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русскомdelphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском


 
MInd_f ©
 
(2005-01-28 11:29)
[3]

Напиши так:
WinExec(“cmd /c SystemInfo>>C:Infa.txt”, 1);

и загружай данные из файла

delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русскомdelphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском


 
Kerk ©
 
(2005-01-28 11:40)
[4]

MInd_f ©   (28.01.05 11:29) [3]WinExec(“cmd /c SystemInfo>>C:Infa.txt”, 1);

убивать за такое надо 🙂

delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русскомdelphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском


 
Smileman
 
(2005-01-28 13:14)
[5]

я ниче не понял

delphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русскомdelphi - Как получить текст который отдает консольное приложение? - Stack Overflow на русском


Выполнение команды 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 на форму.

:/>  Update Agent 7.6.7600.256 x86

Напишите обработчик события кнопки как показано ниже:

procedure TForm1.Button1Click(Sender: TObject);
begin Memo1.Text := GetDosOutput(Edit1.Text);
end;

Введите требуемую команду в поле редактирования, например Help DIR, и щелкните кнопку, чтобы отобразить вывод в управлении Memo.