如何修复我的"self-deleting" .exe提前删除?

How do I fix my "self-deleting" .exe from deleting itself early?

本文关键字:删除 self-deleting 何修复 我的 exe      更新时间:2023-10-16

为了测试和个人概念证明,我有一个.exe文件,它只输出一个简单的字符串,然后调用系统暂停(字面意思是system("pause") C++)。

我有一个简单的Python脚本,我正在Windows XP VM上测试,它在搞砸时执行以下操作:

subprocess.call(r'echo Nothing special. > c:blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:blank.txt', shell=True)

显然,这些命令在命令行上都可以正常工作,为什么通过 Python 调用它们时不能正常工作?

我收到此弹出错误消息:

空白.txt:ads.exe 遇到了 问题,需要关闭。我们是 很抱歉给您带来不便。

如果你在中间 某物,你是信息 工作可能会丢失。

该文件也确实被删除了。似乎系统暂停只是被删除命令压碎了,当我期望弹出.exe时,等待我按回车键,然后脚本将继续并删除文件。

鉴于这些症状,我的理解是,只有在此可执行文件完成初始化后,您才能在此特定设置(Windows XP,可能在特定补丁级别,当可执行文件来自备用流时)安全地删除可执行文件。如果在加载可执行文件时将其删除,程序将崩溃。

在提示符下键入这些命令时,运行 start c:blank.txt:ads.exedel c:blank.txt 之间会经过一些时间,使程序有足够的时间完成加载。当您从脚本运行它们时,两者之间的间隔要短得多(start分支出一个新进程,并且新程序的初始化异步发生)。初始化和删除之间存在争用条件;哪一个获胜取决于执行删除的速度。

尝试在删除文件之前尝试延迟:

import subprocess, time
subprocess.call(r'echo Nothing special. > c:blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:blank.txt:ads.exe', shell=True)
time.sleep(42)  # 42 seconds is overkill, but the delay isn't predictable
subprocess.call(r'del c:blank.txt', shell=True)

发生的情况是每个subprocess.call(..., shell=True)立即返回,因为它们只是告诉 shell 执行命令。在命令行上,调用 exe 以使用 start 命令运行仍会立即返回,即使该 exe 尚未终止。start立即返回,需要告诉它等待:

subprocess.call(r'echo Nothing special. > c:blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:blank.txt:ads.exe', shell=True)
subprocess.call(r'start /wait c:blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:blank.txt', shell=True)
Windows shell

start命令将在新的 shell 中启动程序,然后继续。要等待它完成使用call

subprocess.call(r'call c:blank.txt:ads.exe', shell=True)