Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Windows (https://forum.antichat.xyz/forumdisplay.php?f=42)
-   -   Перехват вывода cmd (https://forum.antichat.xyz/showthread.php?t=34115)

t04 25.02.2007 03:21

Перехват вывода cmd
 
Собственно задача вроде бы простая, но не могу решить, есть run.bat, он выполняется, выводит какие то данные, задача в том что бы перехватить вывод в какую нить строку, plz на Delphi или хотя бы на C++.

LoFFi 25.02.2007 12:57

Могу привести пример на перле

Код:

#!/usr/bin/perl

open(STDOUT,"> out.txt");
system("run.bat");
close(STDOUT);


Данный код весь вывод (а точнее весь STDOUT) отправит в файл out.txt

zl0ba 25.02.2007 13:11

Может поможет : http://www.firststeps.ru/msoffice/win/bats/r.php?13 ты там полистай.

_Great_ 25.02.2007 13:15

LoFFi, это, конечно, хорошо, но пайпы рулят беспезды.
автор, смотри в сторону popen/pclose

begin_end 25.02.2007 14:13

Вот готовый пример реализации, рабочий и на Дельфи:
Код:

function Dos2Win(CmdLine:String):string;
 const BUFSIZE = 2000;
 var SecAttr : TSecurityAttributes;
hReadPipe, hWritePipe : THandle; StartupInfo: TStartUpInfo; ProcessInfo: TProcessInformation;
Buffer : Pchar; WaitReason, BytesRead : DWord;
begin
  with SecAttr do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
// Creazione della pipe
  if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
    begin
    Buffer := AllocMem(BUFSIZE + 1); // Allochiamo un buffer di dimensioni BUFSIZE+1
    FillChar(StartupInfo, Sizeof(StartupInfo), #0);
    StartupInfo.cb := SizeOf(StartupInfo);
    StartupInfo.hStdOutput := hWritePipe;
    StartupInfo.hStdInput := hReadPipe;
    StartupInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
    StartupInfo.wShowWindow := SW_HIDE;
    if CreateProcess(nil,PChar(CmdLine),@SecAttr,@SecAttr,true,NORMAL_PRIORITY_CLASS,nil,
nil,StartupInfo, ProcessInfo) then
      begin
// Attendiamo la fine dell'esecuzione del processo
      repeat
      WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);
      Application.ProcessMessages;
      until (WaitReason <> WAIT_TIMEOUT);
// Leggiamo la pipe
      Repeat
      BytesRead := 0;
// Leggiamo "BUFSIZE" bytes dalla pipe
      ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
// Convertiamo in una stringa "\0 terminated"
      Buffer[BytesRead]:= #0;
// Convertiamo i caratteri da DOS ad ANSI
      OemToAnsi(Buffer,Buffer);
// Scriviamo nell' "OutMemo" l'output ricevuto tramite pipe
      Result := Result + String(Buffer);
      until (BytesRead < BUFSIZE);
    end;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(hReadPipe);
    CloseHandle(hWritePipe);
    end;
end;



Время: 22:31