Перехват вывода cmd

Discussion in 'Безопасность и Анонимность' started by t04, 25 Feb 2007.

  1. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    Собственно задача вроде бы простая, но не могу решить, есть run.bat, он выполняется, выводит какие то данные, задача в том что бы перехватить вывод в какую нить строку, plz на Delphi или хотя бы на C++.
     
  2. LoFFi

    LoFFi Elder - Старейшина

    Joined:
    21 Feb 2006
    Messages:
    194
    Likes Received:
    90
    Reputations:
    85
    Могу привести пример на перле

    Code:
    #!/usr/bin/perl
    
    open(STDOUT,"> out.txt");
    system("run.bat");
    close(STDOUT);
    
    

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

    zl0ba ПсихолоГ

    Joined:
    10 Oct 2006
    Messages:
    393
    Likes Received:
    301
    Reputations:
    52
    Может поможет : http://www.firststeps.ru/msoffice/win/bats/r.php?13 ты там полистай.
     
  4. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    LoFFi, это, конечно, хорошо, но пайпы рулят беспезды.
    автор, смотри в сторону popen/pclose
     
    1 person likes this.
  5. begin_end

    begin_end Green member

    Joined:
    4 Jan 2007
    Messages:
    265
    Likes Received:
    636
    Reputations:
    476
    Вот готовый пример реализации, рабочий и на Дельфи:
    Code:
    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;
    
     
    _________________________
    3 people like this.