Как определить, запускается ли пакетный файл Windows из ZIP-архива - PullRequest
3 голосов
/ 01 ноября 2009

Один из способов распространения нашего приложения (в 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 где-то отображается в пути. Но как?

Ответы [ 6 ]

7 голосов
/ 01 ноября 2009

Ваша программа фактически не запускается из "Внутри" архива. Перед развертыванием архив сначала развертывается во временный каталог (расположение которого может различаться в зависимости от используемого инструмента архивации).

Имея это в виду, становится ясно, что невозможно точно сказать, так или иначе, поэтому, возможно, лучше всего вместо этого проверить наличие других файлов, необходимых для запуска вашей программы относительно местоположения пакетного файла.

4 голосов
/ 01 ноября 2009

Проверить, существует ли другой файл в архиве в том же каталоге?

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

% ~ dp0 - это каталог файла bat (диск и каталог с нулевым аргументом, который является самим файлом bat)

1 голос
/ 02 ноября 2009

Или вы можете распространять свое приложение в виде самораспаковывающегося архива zip. Это сильно подтолкнет пользователей к запуску SFX перед запуском приложения. (Хотя (для некоторых архиваторов) SFX также является ZIP-файлом, поэтому они могут переименовать SFX в .zip, и тогда они вернутся к тому, что вы имеете сегодня).

1 голос
/ 01 ноября 2009

Почему не получается? Я предполагаю, что вам не хватает некоторых файлов, потому что Windows разархивировала только пакетный файл, а не весь архив. Если это так, вы можете проверить, существуют ли эти файлы при запуске командного файла.

0 голосов
/ 01 ноября 2009

Если вы создадите пакетный файл с именем «setup.bat», Windows автоматически разархивирует ВСЕ файлы из zip-файла во временный каталог, вместо того, чтобы предлагать пользователю сделать это.

В setup.bat вы можете начать с cd /d %~dp0, чтобы перейти к текущему каталогу. Затем вы можете просто запустить вашу программу как обычно или выполнить какую-либо установку.

0 голосов
/ 01 ноября 2009

Оболочка Windows (explorer.exe) связывает расширение .zip с внутренним обработчиком zip-папок. Вы можете переименовать что угодно в .zip и оболочка попытается обработать это как таковое. Обработчик zip-папок является расширением оболочки, которое со временем стало довольно интегрированным в оболочку.

Среда командной строки Windows, в которой работает ваш пакетный файл, не имеет концепции сжатых папок. В этом случае все, что вы можете сделать, это найти расширение .zip.

Одна вещь, которую вы можете сделать, это вместо этого распространять ваш пакет как .msi, тогда у вас не будет этих проблем.

...