怎么确认BAT文件已执行完毕
如何确认BAT文件已执行完毕?
我需要在确认批处理文件正确执行完毕后再继续执行判断语句 请问有什么办法能确定BAT文件已正确执行了呢?
------解决方案--------------------
这个简单,首先在你要运行的位置建立一个批处理文件(最后一行必须是删除自身的命令),然后 将其备份到另外一个目录中去,在程序中执行的次序是首先拷贝备份文件到要执行的位置,然后运行BAT文件,然后检查BAT文件是否存在,不存在证明运行完毕!如果还存在则表示运行失败,你自己可以估算一个时间,多少时间后文件还未自动删除则表示运行失败!
------解决方案--------------------
嗯。上面是一种好方案。
下面这个例子,是以前我从网上搜到的,出处没有记录。你耐心试一下。注意,在 C:\ 下建立1.txt、2.txt、3.txt、4.txt用于试验,然后运行程序,把这四个文件名(如c:\1.txt)输入到四个Edit里去,然后勾选CheckBox,点击Button。这与等待运行BAT文件结束是一样的道理。
unit DemoUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, SHELLAPI;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
BtnExec: TButton;
CheckBoxWait: TCheckBox;
Label3: TLabel;
Label4: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Label5: TLabel;
procedure BtnExecClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function ExecAppWait(AppName, Params: string): Boolean;
var
// Structure containing and receiving info about application to start
ShellExInfo: TShellExecuteInfo;
begin
FillChar(ShellExInfo, SizeOf(ShellExInfo), 0);
with ShellExInfo do begin
cbSize := SizeOf(ShellExInfo);
fMask := see_Mask_NoCloseProcess;
Wnd := Application.Handle;
lpFile := PChar(AppName);
lpParameters := PChar(Params);
nShow := sw_ShowNormal;
end;
Result := ShellExecuteEx(@ShellExInfo);
if Result then
while WaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do
begin
Application.ProcessMessages;
if Application.Terminated then Break;
end;
end;
procedure TForm1.BtnExecClick(Sender: TObject);
var
Success: Boolean;
InstanceID: THandle;
begin
{ 最小化窗口,提醒发生的变化 }
Application.Minimize;
Success := False;
try
if CheckBoxWait.Checked then
Success := ExecAppWait(Edit1.Text, Edit2.Text)
else begin
InstanceID := ShellExecute(Handle, 'open ', PChar(Edit1.Text),
PChar(Edit2.Text), nil, SW_SHOW);
Success := InstanceID > = 32; // 小于32可就错了
end;
finally
// 可别忘了恢复我们的程序的窗口!
Application.Restore;
if not Success then
ShowMessage( 'Application 1 failed: ' + Edit1.Text + Edit2.Text);
end;
try
if CheckBoxWait.Checked then
Success := ExecAppWait(Edit3.Text, Edit4.Text)
else begin
InstanceID := ShellExecute(Handle, 'open ', PChar(Edit3.Text),
PChar(Edit4.Text), nil, SW_SHOW);
Success := InstanceID > = 32; //小于32可就错了
end;
finally
//恢复我们的程序的窗口
Application.Restore;
if not Success then
ShowMessage( 'Application 2 failed: ' + Edit3.Text + Edit4.Text);
end;
end;
end.
我需要在确认批处理文件正确执行完毕后再继续执行判断语句 请问有什么办法能确定BAT文件已正确执行了呢?
------解决方案--------------------
这个简单,首先在你要运行的位置建立一个批处理文件(最后一行必须是删除自身的命令),然后 将其备份到另外一个目录中去,在程序中执行的次序是首先拷贝备份文件到要执行的位置,然后运行BAT文件,然后检查BAT文件是否存在,不存在证明运行完毕!如果还存在则表示运行失败,你自己可以估算一个时间,多少时间后文件还未自动删除则表示运行失败!
------解决方案--------------------
嗯。上面是一种好方案。
下面这个例子,是以前我从网上搜到的,出处没有记录。你耐心试一下。注意,在 C:\ 下建立1.txt、2.txt、3.txt、4.txt用于试验,然后运行程序,把这四个文件名(如c:\1.txt)输入到四个Edit里去,然后勾选CheckBox,点击Button。这与等待运行BAT文件结束是一样的道理。
unit DemoUnit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls, SHELLAPI;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
BtnExec: TButton;
CheckBoxWait: TCheckBox;
Label3: TLabel;
Label4: TLabel;
Edit3: TEdit;
Edit4: TEdit;
Label5: TLabel;
procedure BtnExecClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function ExecAppWait(AppName, Params: string): Boolean;
var
// Structure containing and receiving info about application to start
ShellExInfo: TShellExecuteInfo;
begin
FillChar(ShellExInfo, SizeOf(ShellExInfo), 0);
with ShellExInfo do begin
cbSize := SizeOf(ShellExInfo);
fMask := see_Mask_NoCloseProcess;
Wnd := Application.Handle;
lpFile := PChar(AppName);
lpParameters := PChar(Params);
nShow := sw_ShowNormal;
end;
Result := ShellExecuteEx(@ShellExInfo);
if Result then
while WaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do
begin
Application.ProcessMessages;
if Application.Terminated then Break;
end;
end;
procedure TForm1.BtnExecClick(Sender: TObject);
var
Success: Boolean;
InstanceID: THandle;
begin
{ 最小化窗口,提醒发生的变化 }
Application.Minimize;
Success := False;
try
if CheckBoxWait.Checked then
Success := ExecAppWait(Edit1.Text, Edit2.Text)
else begin
InstanceID := ShellExecute(Handle, 'open ', PChar(Edit1.Text),
PChar(Edit2.Text), nil, SW_SHOW);
Success := InstanceID > = 32; // 小于32可就错了
end;
finally
// 可别忘了恢复我们的程序的窗口!
Application.Restore;
if not Success then
ShowMessage( 'Application 1 failed: ' + Edit1.Text + Edit2.Text);
end;
try
if CheckBoxWait.Checked then
Success := ExecAppWait(Edit3.Text, Edit4.Text)
else begin
InstanceID := ShellExecute(Handle, 'open ', PChar(Edit3.Text),
PChar(Edit4.Text), nil, SW_SHOW);
Success := InstanceID > = 32; //小于32可就错了
end;
finally
//恢复我们的程序的窗口
Application.Restore;
if not Success then
ShowMessage( 'Application 2 failed: ' + Edit3.Text + Edit4.Text);
end;
end;
end.