Войти

Показать полную графическую версию : [решено] Разархивирование файлов отдельной папки архива, через обращение к реестру


Browning Zed
29-11-2018, 12:30
Здравствуйте, уважаемые форумчане. Будьте добры, подскажите как можно осуществить следующую операцию:

1. В реестре найти путь к WinRAR по ветке:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\WinRAR.exe /Path
и запустить его

2. Открыть архив Pack.rar (который лежит в одной директории с bat-файлом), и выбрать в нем все файлы и подпапки расположенные в данном архиве по пути Extras\Controller\

3. Распаковать их в папку "%UserProfile%\Documents\Extras\Control_1"

В итоге должно получится выражение, наподобие следующего:
"Запуск WinRAR через реестр" x "путь к файлам находящимся в определенной папке в архиве" "%UserProfile%\Documents\Extras\Control_1"

Iska
29-11-2018, 19:57
Browning Zed, примерно так (путь искать не надо):
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~dp0Pack.rar
set sDestFolder=%UserProfile%\Documents\Extras\Control_1
set sMask=Extras\Controller\*.*

if exist "%sSourceFile%" (
start "" "winrar.exe" x -o+ "%sSourceFile%" "%sMask%" "%sDestFolder%\"
) else (
echo Can't find source file [%sSourceFile%].
exit /b 1
)

endlocal
exit /b 0

Browning Zed
29-11-2018, 20:31
Благодарю Вас, Iska, это гениально. А не могли бы в двух словах объяснить, каким образом этот код находит WinRAR? То есть, с простым путём, типа C:\Program Files\WinRAR\WinRAR.exe - понятно. А тут как работает?

Iska
29-11-2018, 20:45
В двух — навряд ли. В большем же количестве — могу.

Никак не находит. В параметре App Paths хранятся имена исполняемых файлов и пути к ним, который может использовать функция ShellExecute(). Наша задача — лишь опосредованно вызвать её, что и делается посредством команды start. Примерно то же происходит, когда Вы последовательно делаете Win-R, winrar.exe, Enter. Просто в командной строке такой фокус не проделать — там просматривается только PATH (а вот в Far Manager'е можно — тамошний обработчик командной строки-запускатор задействует параметр App Paths [он, кстати, и себя туда добавляет]).

Ссылки для чтения:
В каких случаях при запуске программы не надо указывать полный путь к ней – Вадим Стеркин (http://www.outsidethebox.ms/12669/)
Application Registration | Microsoft Docs (https://docs.microsoft.com/en-us/windows/desktop/shell/app-registration)
How the App Paths Registry Key Makes Windows Both Faster and Safer • Helge Klein (https://helgeklein.com/blog/2010/08/how-the-app-paths-registry-key-makes-windows-both-faster-and-safer/?PageSpeed=noscript)

Browning Zed
29-11-2018, 20:52
Iska, спасибо за развернутый ответ. Пойду курить мануалы.

А можно ли посредством этого кода разархивировать файлы находящиеся в архиве в директории определяемые через реестр?

1-я ветка реестра (системная папка «Документы»)
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders / "Personal"

2-я ветка реестра (папка с игрой)
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\bioware\mass effect / "path"

где "Personal" и "path" - ключи реестра содержащие пути.

Iska
30-11-2018, 00:11
Из письма в PM:
не могли бы Вы ещё помочь с решением одного вопроса в теме:
Browning Zed, откровенно говоря, не испытываю большого желания делать сие на пакетных файлах.

Browning Zed
30-11-2018, 12:22
откровенно говоря, не испытываю большого желания делать сие на пакетных файлах. »
Но ведь технически, это возможно? Нужен простой пример, как это сделать. На основе этой ветки:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\bioware\mass effect / "path"

Пробую так - ничего не получается:
@echo off
setlocal enableextensions enabledelayedexpansion
set reg_path=HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\bioware\mass effect
set reg_param=path
for /f "tokens=1,2,*" %%a in ('reg query "%reg_path%" /v "%reg_param%"') do if "%%a"=="%reg_param%" set reg_value=%%c
set sSourceFile=%~dp0Pack.rar
set sMask=Extras\Controller\*.*
if exist "%sSourceFile%" (
start "" "winrar.exe" x -o+ "%sSourceFile%" "%sMask%" "%reg_value%\"
) else (
echo Can't find source file [%sSourceFile%].
exit /b 1
)

endlocal
exit /b 0

Iska
30-11-2018, 18:09
Browning Zed, технически возможно. Возни много. Начиная с того, что надо сначала определить разрядность установленной ОС, и только в зависимости от этого лезть по тому или иному пути в реестр.

Browning Zed
30-11-2018, 18:36
Iska, в моем случае, как мне кажется, реестр не будет иметь значения.
Собственно, для чего это нужно. Делаю модификацию для игры. Суть модификации - замена текстур со старых на новые (расположенных в директории приложения), а также замена файла конфигурации игры (находящемся в папке «Документы»), с измененными значениями, дабы эти текстуры в игре активировать. Никакие значения в реестре затрагиваться не будут. И делать инсталлятор для простых процедур распаковки и копипаста, как по мне, излишне.

Iska
30-11-2018, 18:54
И делать инсталлятор для простых процедур распаковки и копипаста, как по мне, излишне. »
И напрасно. Inno Setup вполне будет гож в этом случае. Старые текстуры и файл конфигурации можно зарезервировать и при удалении модификации — восстановить.

Browning Zed
30-11-2018, 19:07
Старые текстуры и файл конфигурации можно зарезервировать и при удалении модификации — восстановить. »
Модификация будет предназначаться для стимовской версии игры. Там функция восстановления файлов заложена по умолчанию - опция «проверить целостность файлов игры». Да и я, не большой сторонник резервирования файлов приложений, если только эти файлы не относятся напрямую к ОС или к важным БД. Червь резервирования точит тело SSD.
Iska, ну будьте добры, всего один пример, большего не прошу. (:




© OSzone.net 2001-2012