为什么不建议直接从 .zip 文件运行 .exe 文件?

Pho*_*nix 26 windows zip

我以为我可以压缩一个.exe文件以供便携使用。但是 Windows 说它不起作用,因为它可能依赖于压缩文件夹中的其他文件。

Windows 警告消息

这是什么意思?为什么我不能直接从 zip 文件运行程序?应用程序可以使用相对路径而不是直接路径来访问其他文件。

Kel*_*ari 76

可执行文件 (.exe) 可以依赖其他文件来正确执行。例如,他们可能需要一个动态链接库 (.dll) 来运行外部代码、一个用于配置的文本文件(.ini、.txt 等),或者一个用于数据的数据库文件。

从存档中运行可执行文件(如 .zip 文件)时,可能无法提取这些文件,并且程序将无法按预期运行。或者,程序可能会在不同的位置运行并创建这些文件。如果您随后将该存档移至另一台计算机,则这些文件将不存在。

如果您 100% 确信从存档中运行程序不会导致任何问题,那么您可以放心地忽略该消息。

  • 措辞上的一点改进:在执行之前,将.exe 从zip 存档中提取到临时目录中,然后执行。它(可能)依赖的文件没有被提取,这可能会导致 .exe 失败。如果 .exe 不依赖于存档中的其他文件,它会运行得很好。 (63认同)
  • 我注意到的另一件事是,某些程序在将它们提取到的路径上写入时可能存在问题。 (5认同)
  • “如果您随后将该存档移动到另一台计算机,这些文件将不存在” - 这当然取决于用于打开存档的应用程序,但是一旦您关闭可执行文件或存档,这些文件可能会消失,或者它们可能不会在多次尝试打开存档或可执行文件之间共享,或者只是很难找到。 (3认同)
  • 此外,直接从临时文件夹执行可执行文件是不合理的危险。多年来,已经发现了太多将 dll 放入临时文件夹的方法。 (3认同)
  • @Phoenix 在某个时间点,恶意 DLL 被放入临时文件夹中。稍后,您从 templ 文件夹运行 .exe(例如“直接”从 .zip 文件)。然后,该 .exe 会选择恶意 DLL,而不是它应该选择的那个(例如,留在存档中的那个)。 (3认同)
  • 对不起,第二条评论。例外的是 .msi 安装程序和 .exe 自动提取或 .exe 安装程序。那些 **GENERALLY** 可以从 .zip 文件打开而不会出现问题。驱动程序安装程序通常是个例外。例如,华硕将文件展开到 .zip 文件内的子文件夹中。 (2认同)

plu*_*ash 26

尽管现代 Windows 使 ZIP 文件看起来像文件夹,但这只是肤浅的。程序不能做类似的事情open('c:\foo.zip\bar.txt','rb')

因此,当您双击 ZIP 文件中的文件时,Windows 会将该文件解压缩到一个临时目录,然后打开该临时文件。

这在几个方面是有问题的。首先,如果临时文件被修改,那么修改将无法回到 ZIP 文件中。IIRC,Windows 通过将临时文件标记为只读来缓解这种情况。其次,如果该文件依赖于在正确的相对位置中可用的其他文件,则不会找到它们。

许多可执行文件依赖于支持文件,因此 MS 添加了警告并提供了一个选项,可以只提取可执行文件,或者提取 ZIP 文件中的所有内容。

但是,它们都不适用于许多“便携式应用程序”,因为无法修改程序数据文件以找到返回 ZIP 文件的方法。


小智 5

从 zip 运行 .exe 可能会导致问题的原因有很多。

首先如上所述,当您“运行”文件时,它实际上被提取到一个临时位置,然后执行。

即时问题意味着,任何可能也被 EXE 压缩的文件可能不会被提取,因此无法访问。这可能包括运行 .exe 所需的库、配置文件,甚至像帮助文件这样简单的东西。

此外,即使您确实将“您认为”所需的文件的所有内容都压缩了(到 zip 文件中),并且这些是一些提取方式,现代安装经常包括以下内容:

添加到 windows 注册表库/驱动程序文件中的数据存储在其他位置,因为它们可能与其他程序共享库/驱动程序文件注册

这只是基础知识

然后,您还有其他潜在的附加问题,如访问/文件权限,这些问题可能会丢失,因此程序可能会错误地执行。

然后,即使您让程序运行,大多数现代应用程序也需要保存某种配置数据,以备将来使用。由于该应用程序位于临时位置,它可能会被删除(连同它创建的任何文件),并且几乎不可能再次找到(是的,我知道这实际上并非不可能,但它不是很容易管理)。值得注意的是,应用程序创建的任何内容都可能找不到返回 zip 的方式。

因此,除非您有一个不需要保存配置的独立应用程序,并且专门设计为作为独立应用程序运行,否则最好不要尝试从 Zip 运行它。

如果您正在尝试制作可移植的东西,那么使用设计为从记忆棒或虚拟驱动器运行的应用程序通常是更好的选择。

希望这可以帮助。