我们的应用程序分发方式之一(在Windows上)是ZIP存档。此存档内部是用于启动应用程序的批处理文件。用户应该在运行我们的应用程序之前解压缩存档,但是用户经常忽略我们的说明并尝试运行应用程序而不首先解压缩存档。当用户这样做时,应用程序无法启动,但是(对用户)确切地说是导致失败的原因并不明显。我们想从批处理文件中检测它是否从ZIP存档中运行,如果是,则向用户显示一条消息,提醒他先解压缩存档。
但是,我根本不清楚如何检测这种情况。虽然批处理变量%cmdcmdline%
包含运行批处理文件的命令,但似乎无法使用该路径可靠地判断路径是否指向ZIP存档。例如,我将以下名为test.bat的批处理文件放入ZIP存档中:
echo %cmdcmdline% pause
从档案馆中运行时,输出为:
cmd /c ""C:\Users\liana\AppData\Local\Temp\Temp1_test.zip\test.bat" "
现在,似乎可能 Temp1_test.zip是一个ZIP存档,而不是真正的目录,但不能保证它是。显然,Windows知道如何区分,所以必须有一些更可靠的方法,而不是简单地检查“.zip”是否出现在某个地方的路径中。但是如何?
答案 0 :(得分:7)
您的程序实际上并未从存档中的“内部”运行。在运行之前,存档首先扩展到临时目录(其位置可能因使用的归档工具而异)。
考虑到这一点,很明显,永远不可能以这种或那种方式确定,所以最好的办法是检查是否存在运行程序所需的其他文件,相对于批处理文件的位置。
答案 1 :(得分:4)
检查存档中的另一个文件是否存在于同一目录中?
if not exist "%~dp0\someotherfile" goto print_please_unzip_ffs_message
%~dp0是bat文件的目录(参数为零的驱动器和目录,这是bat文件本身)
答案 2 :(得分:1)
为什么会失败?我认为你错过了一些文件,因为Windows只解压缩批处理文件而不是整个存档。如果这是真的,您可以检查批处理文件启动时是否存在这些文件。
答案 3 :(得分:1)
或者您可以将您的应用分发为自解压zip存档。这样做会强烈鼓励用户在运行应用程序之前运行SFX。 (虽然,(对于一些归档者)SFX也是一个ZIP,因此他们可以将SFX重命名为.zip,然后他们将回到你今天拥有的东西)。
答案 4 :(得分:0)
Windows shell(explorer.exe)将.zip扩展名与内部zip-folder处理程序相关联。您可以将任何内容重命名为.zip,shell将尝试对其进行处理。 zip文件夹处理程序是一个shell扩展,随着时间的推移,它已经完全集成到shell中。
批处理文件操作的Windows命令行环境没有压缩文件夹的概念。在这种情况下,您所能做的就是寻找.zip扩展名。
您可以做的一件事就是将您的软件包分发为.msi,然后您就不会遇到这些问题。
答案 5 :(得分:0)
如果您创建名为“setup.bat”的批处理文件,Windows将以静默方式将zip文件中的所有文件解压缩到临时目录,而不是提示用户是否要这样做。
在setup.bat中,您可以从cd /d %~dp0
开始更改为当前正在执行的目录。然后,您可以正常运行程序,或进行某种安装。