nakula, возможны три варианта решения задачи (т.к. конкретных названий программы и ее путей не указано, будет все делать на примере программы "
Punto Switcher ":
1 Заранее прописать путь распаковки в конфиге SFX:
Код:
InstallPath="c:\\Program Files (x86)\\Yandex\\Punto Switcher"
2 Если заранее путь неизвестен, но известен на момент запуска SFX, то будем использовать ключ для запуска SFX:
Код:
sfx.exe -InstallPath="c:\\Program Files (x86)\\Yandex\\Punto Switcher"
Вариант 2 можно использовать одновременно с вариантом 1. Тогда при отсутствии ключа установка будет происходить по "умолчальному" пути, а, в случае необходимости, этот путь можно изменить на другой ключом.
3 Путь неизвестен и его надо найти непосредственно из запущенного SFX.
В этом случае нужно знать некоторые подробности искомой папки и файлов в ней дабы выбрать достаточно уникальный файл и путь к нему не повторяющийся в других папках. Для
Punto Switcher выбираем
Punto Switcher\Data\triggers.dat. Имя файла + путь к нему достаточно уникальны для нашей задачи идентификации папки
Punto Switcher.
В конфиге удаляем параметр
InstallPath, дабы распаковка происходила во временную папку, и пишем такую строку:
Код:
RunProgram="hidcon:cmd /c For %z In (c d e f g h i j k l m n o p q r s t u v w x y z) Do For /F \"delims=\" %a In ('Dir /b /s \"%z:\\\" 2^>Nul ^| Find \"Punto Switcher\\Data\\triggers.dat\"') Do Set fp=%a& Call xCopy * \"%%fp:\\Data\\triggers.dat=%%\" /s /e /i /y /h /k& Exit"
SFX будет искать указанный файл на всех дисках в папках любой глубины вложенности и как только найдет его, то скопирует все содержимое своего архива в указанную папку
Punto Switcher с сохранением всей структуры папок и файлов в архиве. После этого поиск прекратится. Если на разных дисках или в разных папках будут установлены другие копии программы
Punto Switcher с искомым файлом, они будут проигнорированы, ибо SFX не может знать в какою именно копию программы нужно произвести распаковку.