Форум программистов, компьютерный форум CyberForum.ru

Как отследить результат выполнения "cmd dir"? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 5.00
MaD1
Сообщений: n/a
06.03.2011, 21:15     Как отследить результат выполнения "cmd dir"? #1
Здорово, народ!

У меня такая проблема:
например я функцией WinExec() или ShellExecute()
запускаю допустим команду 'dir' - так вот как мне результат выполнения данной команды (т.е. полившийся список файлов) направить допустим в переменную?

Надеюсь, доходчиво объяснил
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 21:15     Как отследить результат выполнения "cmd dir"?
Посмотрите здесь:

system("") промелькивает окно cmd(( c++ C++
C++ Как "подкрасить" некоторые элементы массива на выводе во время выполнения программы
Передача консольных команд в CMD через system(""); C++
Как отследить ошибку "Stack around the variable was corrupted."? C++
C++ Подскажите как сделать, например "для продолжения нажмите клавишу х" и дальше выводится результат с шагом заданым пользователем
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Silver
Сообщений: n/a
07.03.2011, 10:54     Как отследить результат выполнения "cmd dir"? #2
Дико извиняюсь, но это азы работы с командной строкой
---
dir > file.txt
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
07.03.2011, 13:55     Как отследить результат выполнения "cmd dir"? #3
Стандартными средствами pipe!!
Можно перенаправить i/o поток в файл, буфер, парсер, другое приложение. Все это можно выдрать из инета...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SECURITY_ATTRIBUTES sa;
....
HANDLE hStdOutReadTmp;
CreatePipe(&hStdOutReadTmp, &m_stdOut.....
 
STARTUPINFO si;
::ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
-------------------------------
si.hStdOutput = hStdOut;
-------------------------------
 
CreateProcess('dir'....... &si, &pi);
MaD1
Сообщений: n/a
07.03.2011, 17:06     Как отследить результат выполнения "cmd dir"? #4
Я знаю как работать с коммандной строкой! Блин, попробую с пипе - этот чувак мнея понял
MaD1
Сообщений: n/a
07.03.2011, 17:13     Как отследить результат выполнения "cmd dir"? #5
Я конечно извиняюсь, но не могли бы ли вы подкинуть мне ссылку? Сам что-то не могу найти, находится только про PIPE+сеть - а это по-моему не то.
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
07.03.2011, 17:25     Как отследить результат выполнения "cmd dir"? #6
Исходники этого(см.выше) кода выслал по почте.
Silver
Сообщений: n/a
07.03.2011, 17:48     Как отследить результат выполнения "cmd dir"? #7
Не обижайся! Мне кажется проще сбросить все в файл
и потом его обработать, чем связываться с пайпами.
Достоинство программы в её работоспособности,
а не красоте исходного кода.
Silver
Сообщений: n/a
07.03.2011, 17:50     Как отследить результат выполнения "cmd dir"? #8
Если уж на то пошло, то почему не использовать
FindFirst + FindNext ?
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
07.03.2011, 18:02     Как отследить результат выполнения "cmd dir"? #9
Эти функции для работы с базами данных?
На придыдущие : -'амбиции и желание совершенства съедают'.

Есть разные задачи, есть разные способы)
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
08.03.2011, 10:02     Как отследить результат выполнения "cmd dir"? #10
Как захватить весь вывод в консоли.

Компилятор: Delphi



Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
unit consoleoutput; 
 
interface
 
uses
  Controls, Windows, SysUtils, Forms;
 
function GetDosOutput(const CommandLine:string): string;
 
implementation
 
function GetDosOutput(const CommandLine:string): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir, Line: String;
begin
  Application.ProcessMessages;
  with SA do
  begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  // создаём пайп для перенаправления стандартного вывода
  CreatePipe(StdOutPipeRead,  // дескриптор чтения
             StdOutPipeWrite, // дескриптор записи
             @SA,              // аттрибуты безопасности
             0                // количество байт принятых для пайпа - 0 по умолчанию
             );
  try
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
    // а так же проверяем, чтобы он не показывался на экране.
    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); // стандартный ввод не перенаправляем
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
 
    // Запускаем компилятор из командной строки
    WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI);
 
    // Теперь, когда дескриптор получен, для безопасности закрываем запись.
    // Нам не нужно, чтобы произошло случайное чтение или запись.
    CloseHandle(StdOutPipeWrite); 
    // если процесс может быть создан, то дескриптор, это его вывод
    if not WasOK then
      raise Exception.Create('Could not execute command line!')
    else
      try
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
        Line := ''
        repeat
          // читаем блок символов (могут содержать возвраты каретки и переводы строки)
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
 
          // есть ли что-нибудь ещё для чтения?
          if BytesRead > 0 then
          begin
            // завершаем буфер PChar-ом
            Buffer[BytesRead] := #0;
            // добавляем буфер в общий вывод
            Line := Line + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        // ждём, пока завершится консольное приложение
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        // Закрываем все оставшиеся дескрипторы
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
      result:=Line;
      CloseHandle(StdOutPipeRead);
  end;
end;
 
end.
Запуск программ с передачей консольного ввода и чтением вывода.

Компилятор: Delphi

Автор: Алексей Бойко

Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент.

Delphi
1
2
3
4
5
function ExecuteFile(FileName,StdInput: string;
                     TimeOut: integer;
                     var StdOutput:string) : boolean;
 
label Error;
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
08.03.2011, 10:26     Как отследить результат выполнения "cmd dir"? #11
Как использовать консоль в не-консольном приложении.

Компилятор: Delphi 3.x (или выше)

Для того, чтобы добавить в не-консольное приложение ввод/вывод из консоли, необходимо воспользоваться функциями AllocConsole и FreeConsole.

Пример:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject); 
var 
   s: string; 
begin 
  AllocConsole; 
  try 
    Write('Type here your words and press ENTER: '); 
    Readln(s); 
    ShowMessage(Format('You typed: '%s'', [s])); 
  finally 
    FreeConsole; 
  end; 
end;
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
08.03.2011, 10:31     Как отследить результат выполнения "cmd dir"? #12
никто не застваляет делать это на дельфи )
ну раз эти водоплавающие делают...
Сионистам это сам бог велел !!!
С++ и винда разговаривают на языке: ты и я одной крови ))
MaD1
Сообщений: n/a
08.03.2011, 16:45     Как отследить результат выполнения "cmd dir"? #13
Люди! Я не очень представляю себе что такое пайпы, но думаю что это хорошо По-моему проще WinExec'ом запутсить батник в котором 'dir > file.txt' а потом прочиттать этот файл. Так легче, но быстрее ли? хмм наверное нет. А с пайпами я никак не разберусь....
Silver
Сообщений: n/a
09.03.2011, 14:51     Как отследить результат выполнения "cmd dir"? #14
Я именно это и предлагал с самого начала.
Ребята, давайте писать (программы) просто!
Простота как известно синоним гениальности.
DmSK
0 / 0 / 0
Регистрация: 07.03.2011
Сообщений: 13
09.03.2011, 14:58     Как отследить результат выполнения "cmd dir"? #15
Не все простое гениальное: Не синоним)

За сложным решением всегда следует простое обьяснение не попробуешь не узнаешь.
MaD1
Сообщений: n/a
09.03.2011, 18:26     Как отследить результат выполнения "cmd dir"? #16
ладно, придется разбираться с пайпами, понял куда копать. Всем спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2011, 22:38     Как отследить результат выполнения "cmd dir"?
Еще ссылки по теме:

C++ Error NSB6006 "cmd.exe" завершилась с кодом 1
Как правильно задать параметр "время выполнения алгоритма"? C++
Error MSB6006: "cmd.exe" exited with code 3 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
man_of_ring
4 / 4 / 0
Регистрация: 09.12.2010
Сообщений: 278
14.03.2011, 22:38     Как отследить результат выполнения "cmd dir"? #17
пайп это труба
ну че проще труба на однм конце одно на дургом дургое..
данные идут от одного конца к другому...

че может быть проще...?
а через тестовик...хм кому как...
но это разве программирование...?
Yandex
Объявления
14.03.2011, 22:38     Как отследить результат выполнения "cmd dir"?
Ответ Создать тему
Опции темы

Текущее время: 23:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru