Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Выполнить консольную команду и вернуть результат?   Найти похожие ветки 

 
markers ©   (2005-11-10 16:16) [0]

Здраствуйте!!!
У меня следующий вопрос, нужно выполнить некую консольную команду (Например: ping, format, chkdsk) И получить (Желательно получать по появлению нового текста) результат работы данной команды/программы. И чтоб консольное окно было скрыто.
Пробовал запускать команду WinExec("ping ya.ru >test.txt")? А так же через CreateProcess..... Ноль имоций, фунт презрения.... Помогите плиз!


 
Leonid Troyanovsky ©   (2005-11-10 16:26) [1]


> markers ©   (10.11.05 16:16)  

> Пробовал запускать команду WinExec("ping ya.ru >test.txt")?


cmd /c ping ya.ry>test.txt

--
Regards, LVT.


 
Digitman ©   (2005-11-10 16:37) [2]


> markers ©   (10.11.05 16:16)  


> А так же через CreateProcess


изучать Anonymous Pipes .. до полного просветления ...


 
markers ©   (2005-11-10 17:27) [3]

Нашёл я кодик который делает, то что мне нужно.... Но почему-то например запускаешь через него ping ngs.ru Ping возвращает "При проверке связи не удалось обнаружить узел ngs.ru. Проверьте имя узла и повторите попытку.", Когда тут же проверяю тоже самое воожу и всё есть.... И например нет реакции на команду dir.... Код ниже:
procedure TForm1.ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:
                                                                  TStringList);
var
sa : TSECURITYATTRIBUTES;
si : TSTARTUPINFO;
pi : TPROCESSINFORMATION;
hPipeOutputRead : THANDLE;
hPipeOutputWrite : THANDLE;
hPipeErrorsRead : THANDLE;
hPipeErrorsWrite : THANDLE;
Res, bTest : Boolean;
env : array[0..100] of Char;
szBuffer : array[0..256] of Char;
dwNumberOfBytesRead: DWORD;
Stream : TMemoryStream;
begin
sa.nLength := sizeof(sa);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := nil;
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
ZeroMemory(@env, SizeOf(env));
ZeroMemory(@si, SizeOf(si));
ZeroMemory(@pi, SizeOf(pi));
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
si.wShowWindow := SW_HIDE;
si.hStdInput := 0;
si.hStdOutput := hPipeOutputWrite;
si.hStdError := hPipeErrorsWrite;

{ Если вы хотите запустить процесс без параметров, заnil`те второй параметр
  и используйте первый
}
Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
               CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS or CREATE_UNICODE_ENVIRONMENT, @env, nil, si, pi);

// Если не получилось - то выходим
if not Res then
begin
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsRead);
  CloseHandle(hPipeErrorsWrite);
  Exit;
end;
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeErrorsWrite);

//Читаем вывод
Stream := TMemoryStream.Create;
try
 while true do
 begin
  bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead, nil);
  if not bTest then
  begin
   break;
  end;
  Stream.Write(szBuffer, dwNumberOfBytesRead);
 end;
 Stream.Position := 0;
 Output.LoadFromStream(Stream);
finally
 Stream.Free;
end;

//Вывод о ошибках
Stream := TMemoryStream.Create;
try
 while true do
 begin
  bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead, nil);
  if not bTest then
  begin
   break;
  end;
  Stream.Write(szBuffer, dwNumberOfBytesRead);
 end;
 Stream.Position := 0;
 Errors.LoadFromStream(Stream);
finally
 Stream.Free;
end;

WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeErrorsRead);
end;

Не подскажите, в чём может быть причина? А кстати тоже пинг но только на реальный ап адрес даёт верный результат! Мож, каких прав под этой консолью новой не хватает?


 
markers ©   (2005-11-10 17:27) [4]

Удалено модератором


 
Leonid Troyanovsky ©   (2005-11-11 09:08) [5]


> markers ©   (10.11.05 17:27) [4]

> то например запускаешь через него ping ngs.ru Ping возвращает
> "При проверке связи не удалось обнаружить узел ngs.ru. Проверьте
> имя узла и повторите попытку.", Когда тут же проверяю тоже
> самое воожу и всё есть.... И например нет реакции на команду
> dir....


Может он, дейс-но, не обнаружен.  Т.е., "права консоли" здесь ни причем.
Ну, а dir - это команда интерпретатора cmd.exe.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.11.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
3-1129630838
vinni2000
2005-10-18 14:20
2005.11.27
Работа с временной или виртуальной таблицей?


2-1131308159
ДимаДА
2005-11-06 23:15
2005.11.27
как с помощью АПИ узнать


9-1121200003
Turkish
2005-07-13 00:26
2005.11.27
Помогите чем сможите


14-1130934487
Del_programmer
2005-11-02 15:28
2005.11.27
МОБИЛЫ


14-1131277515
Pazitron_Brain
2005-11-06 14:45
2005.11.27
Как бы вы обновили такой компьютер?