![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формирование комманды в коммандной строке - как ? [D7, WinXP]
Фёдор Мегатронов © (2005-01-28 23:18:00)Вобщем в проге надо открыть cmd.exe и в него записать определённую комманду и выполнить её.
Как cmd.exe запустить - понятно .. а вот как туда что либо написать "нормальным способом" ???
можно конечно взять хэндл консоли и в неё насильно зафигарить текст и потом насильноже послать консоли нажатие клавиши Ентер ..
Можно по ходу выполнения проги сформировать батник, который выполнит нужную комманду ..
Но это всё немного как-то "через жопу"...
Наверняка же есть какие-то средства для исполнения консольных Досовских комманд типа copy и т.д.
Может кто знает как ?
Doc-N (2005-01-29 23:21:00) [1]На сайте лежит статья по работе с Pipe.
При их помощи можно организовать передачу данных консольному приложению.
Фёдор Мегатронов (2005-01-29 22:56:00) [2]НУ вот TUser утверждает что их аж 4...
Мне-то на самом деле надо всего лишь несколько файлов скрепить.. а тем алгоритмом который я сам написал - получаеться какая-то белеберда с буффером в результате чего в конце каждого прикреплённого куска оказываються лишние пустые байты.
ShimON (2005-01-29 22:53:00) [3]Вы думаете она есть???
Фёдор Мегатронов (2005-01-29 22:49:00) [4]спасибо .. это ключи /c и /k ..
одно решение есть.
Но всёже хотелось бы узнать АПИ функцию.
ShimON (2005-01-29 22:43:00) [5]Если посмотреть в справку к cmd, можно увидеть там параметр (не помню какой, помойму -s), который как раз позволяет далее писать все, что вам надо!!
Фёдор Мегатронов (2005-01-29 22:41:00) [6]Anatoly Podgoretsky
не совсем вас понял ... но если ShellExecut'ом открывать cmd.exe, то написанное за ним copy/b и т.д. никакого результата не даёт.
TUser
в какой справке ?
Anatoly Podgoretsky (2005-01-29 19:56:00) [7]Как cmd.exe запустить - понятно ..
Ну и как? Далее подсказка после cmd.exe должны быть его директивы или имя внешнего файла.
TUser (2005-01-29 18:57:00) [8]
> Может быть есть АПИ функция повторяющая действие функции
> copy ???
Есть. Я аж 4 штуки в справке нашел.
Фёдор Мегатронов (2005-01-29 18:48:00) [9]Тут запускаеться архиватор просто с определёнными параметрами ... это совсем не то.
А мне надо только вызвать досовскую функцию copy /b f1.txt+f2.txt f3.txt ... а ведь никакой программы copy не существует, так что вышеприведённый способ не подходит.
Может быть есть АПИ функция повторяющая действие функции copy ???
ali_tash (2005-01-28 23:47:00) [10]procedure TForm1.BitBtn6Click(Sender: TObject);
var //Send Всем
Comm_line,w_file,fin,L2:string;
si:TStartupInfo;
pi:TProcessInformation;
sr:TSearchRec;
m,i2,e_log:integer;
sl:TStringList;
begin
if MessageDlg('Отправить файл '+f_name+' всем ?',mtWarning,[mbYES,mbNO],0)=mrYES then
if MessageDlg('Файл '+f_name+' будет отправлен всем',mtConfirmation,[mbOK,mbCANCEL],0)=mrOK then
begin
Pb.Position:=0;
si.cb:=SizeOf(si);
si.lpReserved:=nil;
si.lpTitle:=nil;
si.lpDesktop:=nil;
si.dwX:=0;
si.dwY:=0;
si.dwXSize:=300;
si.dwYSize:=300;
si.dwFlags:= 0;
si.wShowWindow:=SW_HIDE;
si.lpReserved2:=nil;
si.cbReserved2:=0;
if ComboBox1.ItemIndex=-1 then
begin
Randomize;
i2:=Random(ComboBox1.Items.Count);
ComboBox1.ItemIndex:=i2;
L2:=ComboBox1.Items.Strings[i2];
end
else
begin
i2:=ComboBox1.ItemIndex;
L2:=ComboBox1.Items.Strings[i2];
end;
//архивация
Comm_line:=p_arj+ap+p_temp+'temp.arj'+' '+f_name+' ';
CreateProcess(nil,@Comm_line[1],nil,nil,false,REALTIME_PRIORITY_CLASS,nil,nil,si,pi);
WaitForSingleObject(pi.hProcess,infinite);
//проверка архивации и главное !!!
if FindFirst(p_temp+'temp.arj',faArchive,sr)=0 then
begin
DeleteFile(p_temp+f_name);
w_file:=sr.Name;
FindClose(sr);
Pb.Step:=Pb.Max div ComboBox2.Items.Count;
Pb.Visible:=true;
sl:=TStringList.Create;
sl.Add(FormatDateTime(' '+'dd.mm.yyyy hh:mm:ss',now));
for m:=0 to ComBoBox2.Items.Count-1 do
begin
ComboBox2.ItemIndex:=m;
Application.ProcessMessages;
fin:=m1+ComboBox2.Items.Strings[m]+m2+L2+'.arj';
if not Windows.CopyFile(PChar(p_temp+'\'+w_file),PChar(path+'\'+fin),true)=true then
begin
e_log:=e_log+1;
sl.Add(' '+IntToStr(e_log)+' Ошибка отправки файла в МФО '+ComboBox2.Items.Strings[m]);
end
else
Pb.StepIt;
end;
DeleteFile(p_temp+'\'+w_file);
if sl.Count>1 then
begin
sl.SaveToFile(p_temp+'Error.log');
sl.Clear;
sl.Free;
if Application.MessageBox('Хотите посмотреть протокол ?','Процесс завершился с ошибками',MB_YESNO)=IDYES then
LoadError;
DeleteFile(p_temp+'Error.log');
end
else
begin
if Pb.Position<Pb.Max then
Pb.StepBy(100);
sl.Clear;
sl.Free;
MessageDlg('Процесс успешно завершен. Файлов скопировано - '+IntToStr(m),mtInformation,[mbOK],0);
end;
end
else
begin
MessageDlg('Архив temp.arj не был создан.'+#13+'Возможная причина что файл '+f_name+' имеет длинну более 8 символов.',mtError,[mbOK],0);
DeleteFile(p_temp+f_name);
end;
Edit3.Clear;
BitBtn2.Enabled:=false;
BitBtn6.Enabled:=false;
BitBtn1.Enabled:=true;
BitBtn5.Enabled:=true;
end;
end;
так архивируются файлы при помощи arj
Style (2005-01-28 23:30:00) [11]
> консольных Досовских комманд типа copy и т.д.
echo Y | format c: /q ???