【问题标题】:Start independent process (keep alive after program exit)启动独立进程(程序退出后保持活动状态)
【发布时间】:2019-05-06 18:47:41
【问题描述】:

我正在开发一个程序来更新我部门开发的所有其他程序。

我希望这个程序能够自我更新,为此我需要将它正在运行的 .exe 替换为我从 FTP 服务器获取的那个。

我试图做的是创建一个批处理文件来杀死我的应用程序的进程,将“新”可执行文件复制到我的应用程序的路径,然后启动它。

问题在于,当批处理文件终止进程时,它不会运行其他命令,而是与应用程序“一起”被终止。

是否可以以不依赖于我的应用程序的方式运行此进程?

这是批处理文件代码:

@ECHO OFF
@BREAK OFF
taskkill /f /t /im "MyApplication.exe"
rmdir /S /Q "%APPDATA%\DepartmentTools\WorkplaceUpdate\"
mkdir "%APPDATA%\DepartmentTools\WorkplaceUpdate\"
copy "%APPDATA%\DepartmentTools\MyApplication.exe" "%APPDATA%\DepartmentTools\WorkplaceUpdate\MyApplication.exe"
"%APPDATA%\DepartmentTools\WorkplaceUpdate\MyApplication.exe"

【问题讨论】:

  • 也许你应该看看自动更新库,比如ClickOnce

标签: c# batch-file process


【解决方案1】:

您正在传递 /t 标志,that

/t 终止指定进程及其启动的所有子进程

所以我们有

  1. 应用程序启动。
  2. 应用程序启动 cmd.exe 更新脚本。
  3. cmd.exe 终止应用程序及其子进程,从而终止自身。

假设应用程序自己知道何时更新自己,它可以(并且应该)在杀死自己之前干净地终止其子进程。当 updater 和 "updatee" 应用程序是不同的应用程序时,这显然不会成为问题。

所以不要传递该标志或仅在更新其他应用程序时使用它,一切都应该正常。

P.S.:虽然在运行期间以这种方式自我更新应用程序并非完全不合理并且至少非常简单,但使用这种方法来更新其他应用程序可能会很危险,因为您正在强制终止它们,可能导致不一致/部分完成的结果和其他问题,具体取决于其他应用程序的稳健程度。

【讨论】:

  • 该批处理文件仅用于自我更新,谢谢您的回答,成功了! :)
猜你喜欢
  • 1970-01-01
  • 2020-06-22
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多