怎么用DELPHI执行一个bat文件,且之后还能在程序里关闭这个cmd窗口?

时间:2022-04-19 02:20:02
怎么用DELPHI执行一个bat文件,且之后还能在程序里关闭这个cmd窗口?

最近写一个程序,需要在业务代码开始之前先运行一个java写的程序,这个程序运行之后是个黑黑的cmd窗口,这是一个命令行程序

程序退出的时候,我希望可以同时向这个CMD窗口发送一些命令(Exit),使得相关java程序正常退出,然后关闭这个cmd窗口。有没有办法实现?

13 个解决方案

#1



shellexecute(form1.handle,'open','c:\vcvarsall.bat','-s','',sw_show);
一般执行完会自动关闭

#2


Shellexecute执行,如果查找窗口可以用进程快照,CreateToolhelp32Snapshot,遍历进程,找到了就发送WM_Close消息或者直接TermianteProcess

#3


WinExec(PChar(bat),SW_HIDE)

#4


引用 1 楼 bdmh 的回复:
Delphi(Pascal) code
shellexecute(form1.handle,'open','c:\vcvarsall.bat','-s','',sw_show);
一般执行完会自动关闭


认为该楼一般不会错,呵呵

#5


记得默认情况下,执行完一个外部程序后,命令窗口就是自动关闭退出的

#6


我要运行的程序是一个驻留程序....不会自动退出的...

#7


不会自动退出那就用遍历进程的方法TerminateProcess,只要知道进程名就好办

#8



var
  BatchFileName: string;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  BatchFileName := ExtractFilePath(ParamStr(0)) + 'A.bat';
  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(BatchFileName), nil, nil,
    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
    ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;

#9


用FindWindow找到句柄,
再用sendmessage或postmessage发送WM_CLOSE关闭之。
若关不了,就直接TerminateProcess

#10


引用 6 楼 linsoo 的回复:
我要运行的程序是一个驻留程序....不会自动退出的...


哦,还有交互的需要啊,那就使用doscmd控件

#11


在bat里最后加上一行:
EXIT

执行完了就自动退CMD窗口了啊。

#12


WinExec(PChar(bat),SW_HIDE)

#13


用DosCommand解决了~~

#1



shellexecute(form1.handle,'open','c:\vcvarsall.bat','-s','',sw_show);
一般执行完会自动关闭

#2


Shellexecute执行,如果查找窗口可以用进程快照,CreateToolhelp32Snapshot,遍历进程,找到了就发送WM_Close消息或者直接TermianteProcess

#3


WinExec(PChar(bat),SW_HIDE)

#4


引用 1 楼 bdmh 的回复:
Delphi(Pascal) code
shellexecute(form1.handle,'open','c:\vcvarsall.bat','-s','',sw_show);
一般执行完会自动关闭


认为该楼一般不会错,呵呵

#5


记得默认情况下,执行完一个外部程序后,命令窗口就是自动关闭退出的

#6


我要运行的程序是一个驻留程序....不会自动退出的...

#7


不会自动退出那就用遍历进程的方法TerminateProcess,只要知道进程名就好办

#8



var
  BatchFileName: string;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  BatchFileName := ExtractFilePath(ParamStr(0)) + 'A.bat';
  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(BatchFileName), nil, nil,
    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
    ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;

#9


用FindWindow找到句柄,
再用sendmessage或postmessage发送WM_CLOSE关闭之。
若关不了,就直接TerminateProcess

#10


引用 6 楼 linsoo 的回复:
我要运行的程序是一个驻留程序....不会自动退出的...


哦,还有交互的需要啊,那就使用doscmd控件

#11


在bat里最后加上一行:
EXIT

执行完了就自动退CMD窗口了啊。

#12


WinExec(PChar(bat),SW_HIDE)

#13


用DosCommand解决了~~