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;

:/>  Как отключить ПИН код Windows 10 при входе | Как настроить?

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.

:/>  Выполнение консольных команд на удаленных компьютерах по сети / Argon / Blog

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 на форму.

:/>  CDMA против GSM - Технология - 2022

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


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

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

Оставьте комментарий

Adblock
detector