Отработанный батник

Саашка

запускаю батник на выполнение так
<b>var</b> BatFile:<b>string</b>;b:textfile;sAppPath:WideString;s:<b>string</b>;
 h: hwnd;
<b>begin</b>
 sAppPath:= ExtractFilePath(Application.EXEName)+'1.txt';

 <i>//сформируем батник</i>
 BatFile:=ExtractFilePath(Application.EXEName)+'\bat.bat';
 AssignFile(b,BatFile);
 rewrite(b);
 s:='copy "'+sAppPath+'" "D:\"';
 writeln(b,s);
 closefile(b);
 <b>if</b> ShellExecute(h, 'open', PChar(BatFile), <b>nil</b>, <b>nil</b>, SW_HIDE) < <b>32</b> <b>then</b>
 <b>begin</b>
 messagebox(Handle,'Error!','Внимание!',<b>0</b>);
 exit;
 <b>end</b>;
<b>end</b>;
как узнать что батник отработал?ведь например, копирование может продолжаться, а программа в делфи продолжит выполнение,Sleep использовать не совсем правильно...
8 ответов

Саашка

AFAIR ShellExecute возвращает ProcessID (если не ошибка). Осталось догадать чего...


Саашка

AFAIR ShellExecute возвращает ProcessID (если не ошибка). Осталось догадать чего...
Returns a value greater than 32 if successful, or an error value that is less than or equal to 32 otherwise. The following table lists the error values. The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.


Саашка

Автор %), а так? (%:
<b>uses</b>
 SysUtils, Windows;

<b>var</b>
 Source, Desc : <b>String</b>;
<b>begin</b>
 ...
 Win32Check( CopyFile( PChar( Source ), PChar( Desc ), True ));
 ...
<b>end</b>;
не судьба?


Саашка

Автор %), а так? (%:
<b>uses</b>
 SysUtils, Windows;

<b>var</b>
 Source, Desc : <b>String</b>;
<b>begin</b>
 ...
 Win32Check( CopyFile( PChar( Source ), PChar( Desc ), True ));
 ...
<b>end</b>;
не судьба?
Ну на самом деле в батнике не только копирование...


Саашка

К примеру?


Саашка

поместите в Ваш батникнапоследок создание нового файла (копированием, например)например файл Ready.Txt нулевой длины.А в цикле ожидания проверяйте наличие этого файла.Естественно после появления его нужно будет удалить.Я бы ещё предусмотрел таймаут, чтоб цикл в любых ситуациях не был вечным.


Саашка

Вот код твоей процедуры:
<b>uses</b> ShellAPI;

<b>procedure</b> TForm1.Button1Click(Sender: TObject);
<b>var</b> 
 BatFile:<b>string</b>;
 b:textfile;
 sAppPath:WideString;
 s:<b>string</b>;
 h: hwnd;

 ShExecInfo: TShellExecuteInfo;
<b>begin</b>
 sAppPath:= ExtractFilePath(Application.EXEName)+'1.txt';

 <i>//сформируем батник</i>
 BatFile:=ExtractFilePath(Application.EXEName)+'\bat.bat';
 AssignFile(b,BatFile);
 rewrite(b);
 s:='copy "'+sAppPath+'" "D:\"';
 writeln(b,s);
 closefile(b);

 FillChar(ShExecInfo, SizeOf(ShExecInfo), <b>0</b>);
 <b>with</b> ShExecInfo <b>do</b>
 <b>begin</b>
 cbSize:= SizeOf(ShExecInfo);
 fMask := SEE_MASK_NOCLOSEPROCESS;
 lpFile:= PChar(BatFile);
 lpVerb:= 'open';
 nShow := SW_SHOW; <i>// SW_HIDE</i>
 <b>end</b>;
 
 <b>if</b> <b>not</b> ShellExecuteEx(@ShExecInfo) <b>then</b>
 <b>begin</b>
 messagebox(Handle,'Error!',''Внимание!',<b>0</b>);
 exit;
 <b>end</b>
 <b>else</b> 
 <b>begin</b>
 WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
 <b>end</b>;

<b>end</b>;
И зачем изобретать велосипед?


Саашка

Можно так сделать:if ShellExecuteEx(@ShExecInfo) then WaitForSingleObject(ShExecInfo.hProcess, INFINITE);