Windows 从.bat文件安全地终止进程

Windows 从.bat文件安全地终止进程,windows,batch-file,taskkill,Windows,Batch File,Taskkill,我有一个VB6应用程序,需要更新它的自我。为此,PM建议使用从应用程序启动的批处理文件。批处理文件应终止进程,从本地服务器下载新版本,覆盖旧文件并再次启动应用程序。 我的问题是,我不确定taskkill返回是否仅在进程被终止并且所有使用的资源都被释放之后才控制父进程;特别是,我们想知道进程“.exe”文件会发生什么变化。是否可以保证在taskkill返回后将其解锁当然,理论上它不应该被任何其他进程锁定,这是我们感兴趣的唯一情况。有一个命令行参数,如VB程序将处理的/Shutdown MyApp.

我有一个VB6应用程序,需要更新它的自我。为此,PM建议使用从应用程序启动的批处理文件。批处理文件应终止进程,从本地服务器下载新版本,覆盖旧文件并再次启动应用程序。

我的问题是,我不确定taskkill返回是否仅在进程被终止并且所有使用的资源都被释放之后才控制父进程;特别是,我们想知道进程“.exe”文件会发生什么变化。是否可以保证在taskkill返回后将其解锁当然,理论上它不应该被任何其他进程锁定,这是我们感兴趣的唯一情况。

有一个命令行参数,如VB程序将处理的/Shutdown

MyApp.exe/关机


/Shutdown参数将查找应用程序的现有运行实例(使用FindWindow API),并向窗口发送一条用户消息,请求其顺利关闭。

Taskkill应仅在进程终止后返回(根据下面的注释:如果需要用户输入,请使用/F标志强制终止程序)


要了解更多信息,您可以使用并查看进程何时终止,以及是否有人仍打开了.exe文件(Ctrl+F和exe的名称)-但情况不应如此。

如果进程被终止,则会释放exe进行更新。作为使用taskkill的替代方法,您可以从sysinternal中使用pskill,但是taskkill应该可以很好地使用/IM参数

但是,pskill或taskkill都不会在返回控制之前等待进程停止。因此,您必须监视这些进程,以确保它们不再运行

此外,这将是我的首选解决方案,可以通过单击一次来部署vb6应用程序,它将自动使用新版本更新应用程序。查看详细信息

对于流程打开的资源,它们可能保持打开状态(例如sql连接),但很可能会成功关闭。只有通过在流程上测试taskkill来监控发生了什么,您才能确定


希望这能有所帮助。

我通过让应用程序自己检查更新来做到这一点。如果有,则应用程序会在临时位置下载它们。之后,它将启动一个(.js)脚本并退出应用程序。此脚本将等待进程关闭(睡眠),复制更新并再次启动应用程序


这样,脚本中的逻辑就大大减少了,您可以在有更多可用工具的环境中完成工作。

流程已经终止,但使用的资源是否已经释放?这是我的问题。它不是,而且很容易测试。打开记事本,在不保存的情况下键入内容,然后运行taskkill/im notepad.exe。当记事本询问您是否要在关闭前保存文档时,您将看到taskkill返回控件。如果进程终止,操作系统应始终释放资源(内存、文件句柄)。@Jeff-如果您使用/Fflag@rslite-对,但那不是我的重点,我的观点是要证明taskkill将在应用程序仍在运行并试图关闭时返回。PSKill被一些间谍软件/病毒扫描程序“识别”为不好的东西。在发布应用程序时,您应该意识到这一点。@GvS-这是一个非常好的观点,我以前在McAfee Enterprise中也遇到过同样的问题。