Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Разархивирование файлов отдельной папки архива, через обращение к реестру (http://forum.oszone.net/showthread.php?t=337958)

Browning Zed 29-11-2018 12:30 2843231

Разархивирование файлов отдельной папки архива, через обращение к реестру
 
Здравствуйте, уважаемые форумчане. Будьте добры, подскажите как можно осуществить следующую операцию:

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 2843316

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 2843321

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

Iska 29-11-2018 20:45 2843324

В двух — навряд ли. В большем же количестве — могу.

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

Ссылки для чтения:
В каких случаях при запуске программы не надо указывать полный путь к ней – Вадим Стеркин
Application Registration | Microsoft Docs
How the App Paths Registry Key Makes Windows Both Faster and Safer • Helge Klein

Browning Zed 29-11-2018 20:52 2843326

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 2843362

Из письма в PM:
Цитата:

Цитата Browning Zed
не могли бы Вы ещё помочь с решением одного вопроса в теме:

Browning Zed, откровенно говоря, не испытываю большого желания делать сие на пакетных файлах.

Browning Zed 30-11-2018 12:22 2843410

Цитата:

Цитата Iska
откровенно говоря, не испытываю большого желания делать сие на пакетных файлах. »

Но ведь технически, это возможно? Нужен простой пример, как это сделать. На основе этой ветки:
Код:

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 2843461

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

Browning Zed 30-11-2018 18:36 2843466

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

Iska 30-11-2018 18:54 2843467

Цитата:

Цитата Browning Zed
И делать инсталлятор для простых процедур распаковки и копипаста, как по мне, излишне. »

И напрасно. Inno Setup вполне будет гож в этом случае. Старые текстуры и файл конфигурации можно зарезервировать и при удалении модификации — восстановить.

Browning Zed 30-11-2018 19:07 2843469

Цитата:

Цитата Iska
Старые текстуры и файл конфигурации можно зарезервировать и при удалении модификации — восстановить. »

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


Время: 17:52.

Время: 17:52.
© OSzone.net 2001-