代码之家  ›  专栏  ›  技术社区  ›  uckelman

如何检测Windows批处理文件是否从zip存档运行

  •  3
  • uckelman  · 技术社区  · 15 年前

    我们的应用程序(在Windows上)的分发方式之一是作为压缩文件。在这个档案中有一个用于启动应用程序的批处理文件。用户应该在运行我们的应用程序之前解压归档文件,但用户经常忽略我们的指示,尝试运行应用程序而不首先解压归档文件。当用户这样做时,应用程序无法启动,但(对用户)并不清楚是什么导致了失败。我们想从批处理文件中检测它是否在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是一个压缩文件,不是一个真正的目录,但不能保证是这样。很明显,Windows知道如何区分,因此必须有比简单检查路径中是否有“.zip”更可靠的方法。但是如何呢?

    6 回复  |  直到 15 年前
        1
  •  7
  •   Jasoon    15 年前

    您的程序实际上不是从存档中运行的。在运行之前,首先将存档扩展到一个临时目录(其位置可能因使用的存档工具而异)。

    考虑到这一点,很明显我们永远不可能确定地以某种方式来判断,所以最好的办法可能是检查运行程序所需的其他文件的存在情况,而不是相对于批处理文件的位置。

        2
  •  4
  •   Joey Gumbo    15 年前

    检查存档中的另一个文件是否存在于同一目录中?

    if not exist "%~dp0\someotherfile" goto print_please_unzip_ffs_message
    

    %~dp0是BAT文件的目录(参数0的驱动器和目录,即BAT文件本身)

        3
  •  1
  •   John Kugelman Michael Hodel    15 年前

    为什么失败了?我想您丢失了一些文件,因为Windows只解压缩了批处理文件,而不是整个归档文件。如果是这样,您可以在批处理文件启动时检查这些文件是否存在。

        4
  •  1
  •   Cheeso    15 年前

    或者你可以将你的应用作为一个自解压的压缩文件分发。这样做会强烈鼓励用户在运行应用程序之前运行sfx。(不过,对于一些存档人员来说,sfx也是一个zip,所以他们可以将sfx重命名为.zip,然后他们就可以恢复到今天的状态)。

        5
  •  0
  •   i_am_jorf    15 年前

    Windows Shell(explorer.exe)将.zip扩展名与内部zip文件夹处理程序关联。您可以将任何内容重命名为.zip,shell将尝试将其视为.zip。Zip文件夹处理程序是一个shell扩展,随着时间的推移,它已经完全集成到shell中。

    批处理文件操作的Windows命令行环境没有压缩文件夹的概念。在这种情况下,您所能做的就是查找.zip扩展名。

    您可以做的一件事是将包作为.msi分发,这样您就不会遇到这些问题。

        6
  •  0
  •   joshperry    15 年前

    如果创建一个名为“setup.bat”的批处理文件,Windows将自动将zip文件中的所有文件解压缩到temp目录,而不是提示用户是否要这样做。

    在setup.bat中,您可以从 cd /d %~dp0 切换到当前正在执行的目录。然后您可以正常运行程序,或者进行某种安装。