![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получение вывода команды xcopy
Priest © (2006-06-09 11:11:00)Запускаю данную команду, как получить то что она обычно выводит в консоль?
Zz_ (2006-06-09 15:08:00) [1]Честно говоря, лично я подобным практически не занимаюсь.
Могу привести лишь код. Почему сделано именно так, я объяснить не могу.
var si : STARTUPINFO;
pi : PROCESS_INFORMATION;
sa : SECURITY_ATTRIBUTES;
sd : SECURITY_DESCRIPTOR;
cout : THandle;
rdout : THandle;
exit_ : DWORD;
bread : DWORD;
avail : DWORD;
buf : array[1..1024] of Char;
sFileCfg : String;
S : String;
tf : TextFile;
n : Integer;
k : Integer;
begin
Screen.Cursor := crHourGlass;
try
if( gf_IsWinNT )then begin
InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, True, nil, False);
sa.lpSecurityDescriptor := @sd;
end else begin
sa.lpSecurityDescriptor := nil;
end;
sa.nLength := sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle := LongBool(True);
for n := 0 to(lbZRE.Count-1)do begin
sFileCfg := . . .;
AssignFile(tf, sFileCfg);
try
ReWrite(tf);
WriteLn(tf, '[Connection]');
. . .
finally
{$I-}CloseFile(tf);{$I+}IOResult;
end;
mLog.Lines.Add( 'Обработка протокола < ' + lbZRE.Items[n] +' >');
if(not CreatePipe(rdout,cout,@sa,0))then raise Exception.Create('Error CreatePipe');
ZeroMemory(@si,sizeof(si));
si.cb := SizeOf(si);
GetStartupInfo(si);
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;
si.hStdOutput := cout;
if not CreateProcess(
nil
, PChar('....exe' + ' ' + sFileCfg)
, nil
, nil
, True
, CREATE_NEW_CONSOLE
, nil
, nil
, si
, pi
)then begin
CloseHandle(cout);
CloseHandle(rdout);
raise Exception.Create('Error CreateProcess');
end;
exit_ := 0;
while(True)do begin
Sleep(10);
PeekNamedPipe(rdout, @buf[1], 1023, @bread, @avail, nil);
if(bread > 0)then begin
ZeroMemory(@buf[1],sizeof(buf));
if(avail > 1023)then begin
while(bread >= 1023)do begin
ReadFile(rdout, buf[1], 1023, bread, nil);
mLog.Text := mLog.Text + PChar(@buf[1]);
ZeroMemory(@buf[1],sizeof(buf));
end;
end else begin
ReadFile(rdout, buf[1], 1023, bread, nil);
mLog.Text := mLog.Text + PChar(@buf[1]);
end;
end;
GetExitCodeProcess(pi.hProcess, exit_);
if(exit_ <> STILL_ACTIVE)then break;
end;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(cout);
CloseHandle(rdout);
if(exit_ = 0)then begin
mLog.Lines.Add('Протокол обработан успешно');
end else begin
mLog.Lines.Add('Ошибка обработки № ( ' + IntToStr(Integer(exit_)) + ' )');
end;
end;
finally
Screen.Cursor := crDefault;
end
Priest (2006-06-09 14:57:00) [2]>>Zz_
А отдельной функции нет? Я не пойму куда это прописывать?
Zz_ (2006-06-09 14:40:00) [3]За такие ФАКИ надо отрывать ...
while(True)do begin
Sleep(10);
PeekNamedPipe(rdout, @buf[1], 1023, @bread, @avail, nil);
if(bread > 0)then begin
ZeroMemory(@buf[1],sizeof(buf));
if(avail > 1023)then begin
while(bread >= 1023)do begin
ReadFile(rdout, buf[1], 1023, bread, nil);
mLog.Text := mLog.Text + PChar(@buf[1]);
ZeroMemory(@buf[1],sizeof(buf));
end;
end else begin
ReadFile(rdout, buf[1], 1023, bread, nil);
mLog.Text := mLog.Text + PChar(@buf[1]);
end;
end;
GetExitCodeProcess(pi.hProcess, exit_);
if(exit_ <> STILL_ACTIVE)then break;
end;
Priest (2006-06-09 14:02:00) [4]Только для xcopy не работает. Для 'route print' всё отлично работает, потому что эта команда выводит результат в конце выполнения. а xcopy постоянно выводит и поэтому не видно вплоть до завершения :(
Ega23 (2006-06-09 12:33:00) [5]
> http://dfc.com.ru/?sid=2&id=7&itemid=2
Прикольно, спасибо за ссылочку...
Priest (2006-06-09 11:51:00) [6]>>easy
Спасибо :)
Priest (2006-06-09 11:30:00) [7]так мне нужно в реал тайм. Я запускаю свою прогу и в ней xcopy. И мне нужо знать что делает прога....xcopy показывает ход выполнения и указывает какой файл скопирован только что....Как такое сделать?
easy (2006-06-09 11:30:00) [8]http://dfc.com.ru/?sid=2&id=7&itemid=2
Ega23 (2006-06-09 11:29:00) [9]xcopy ... >>1.txt
Потом откроешь этот 1.txt