MultiArc

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Моторокер, Avada, CaptainFlint, Nik, d-view

Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Mellomann
Если нужны только просмотр и распаковка, то Total, вроде, и так это делает, разве нет? А на запаковку можно просто отдельную кнопку сделать.
Skif_off
Сообщения: 1257
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

Помимо того, что 7-Zip 24.01 научился распаковывать Zstandard, есть плагины для 7-Zip, в частности Modern7z добавляет поддержку Zstandard (Автор тут публикует новости (там он известен как Aniskin, здесь - как небезысвестный Dec), так что Total7Zip вполне годный вариант.
Аватара пользователя
Mellomann
Сообщения: 716
Зарегистрирован: Пн сен 07, 2009 00:44

Сообщение Mellomann »

Orion9
Да, я знаю, что уже завезли чтение. Мне интересно именно для multiarc.wcx было. Вдруг кто игрался.

Skif_off
Так те форки 7zip играют в отсебятину, а не в соответствие стандартам. Они пытаются пихать zstd потоки в 7z или zip контейнеры, а не давать "обычный" zst файл на выходе.
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Вдруг кто игрался.
Я игрался только с torrentcheck:
https://sourceforge.net/projects/torrentcheck/
Правда сам не знаю зачем :) Но вдруг как пример кому-то пригодится:
Multiarc.ini

Код: Выделить всё

[Torrent]
Archiver=%COMMANDER_PATH%\Plugins\arc\torrent\tor.bat
Description=Torrent
Extension=torrent 
ID=64 34 3A, 64 37 3A, 64 38 3A, 64 31 33 3A
IDPos=0
Start="---"
Format0="    +z+ n++"
List="%PQA %AQA %O %E2"
ExtractWithPath=
Debug=0
BatchUnpack=0
tor.bat

Код: Выделить всё

CHCP 65001

"%~dp0torrentcheck.exe"  -n -t %1 > "%TEMP%\1"
"%~dp0u82a.vbs"

TYPE "%TEMP%\2"
u82a.vbs

Код: Выделить всё

Private Const adReadAll = -1
Private Const adSaveCreateOverWrite = 2
Private Const adTypeBinary = 1
Private Const adTypeText = 2
Private Const adWriteChar = 0

Const SystemFolder = 1, TemporaryFolder = 2
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")

Dim tempFolder: tempFolder = fso.GetSpecialFolder(TemporaryFolder)

Dim f, sFile

UTF8toANSI tempFolder & "\1", tempFolder & "\2"

Set f = fso.GetFile(tempFolder & "\2")

if f.Size < 1024 Then

   sFile = fso.OpenTextFile(f, ForReading, False, TristateFalse).ReadAll

   if InStr(1, sFile, "---------------", 1) = 0 Then 

      aLines = Split(sFile, vbNewLine) 
      
      if Ubound(aLines) < 3 Then 
         MsgBox sFile, vbOKOnly + vbCritical, "Ошибка"
         sOut = "    " & "0" & " ! Error torrentcheck !" 
      else      
         a3 = Split(aLines(2), " : ")
         if Ubound(a3) > 0 Then
         
             a4 = Split(aLines(3), " : ")
             a42 = Split(a4(1), " ")
      
             sOut = "    " & a42(2) & " " & a3(1) 
         else
            MsgBox sFile, vbOKOnly + vbCritical, "Ошибка"
            sOut = "    " & "0" & " ! Error torrentcheck !"          
         end if
             
      end if
      
      Set fo = fso.OpenTextFile(f, ForAppending, True, TristateFalse)  
      fo.Write vbNewLine      
      fo.Write "--- ----------- ---------------------------------------------------------------" & vbNewLine
      fo.Write sOut
      fo.Close
         
   End If

End If

Set fso = nothing

Private Sub UTF8toANSI(ByVal UTF8FName, ByVal ANSIFName)
   On Error Resume Next
   Dim strText
   With CreateObject("ADODB.Stream")
       .Open
       .Type = adTypeBinary
       .LoadFromFile UTF8FName
       .Type = adTypeText
       .Charset = "utf-8"
       strText = .ReadText(adReadAll)
       .Position = 0
       .SetEOS
       .Charset = "windows-1251"
       .WriteText strText, adWriteChar
       .SaveToFile ANSIFName, adSaveCreateOverWrite
       .Close  
        If Err.Number <> 0 Then 
           fso.CopyFile tempFolder & "\1", tempFolder & "\2"
        End if
   End With
End Sub
В принципе, через перенаправление вывода в текстовый файл с последующим его парсингом в скрипте можно сформировать приемлимый для MultiArc вывод любой консольной утилиты (если не важны юникодные имена файлов). Но в вашем случае, мне кажется, не стоит заморачиваться, т.к. Total и так работает с zstd (судя по всему, через UNRAR.DLL, хотя могу и ошибаться).
Аватара пользователя
Mellomann
Сообщения: 716
Зарегистрирован: Пн сен 07, 2009 00:44

Сообщение Mellomann »

Orion9
Работает через свои TCZSTD32.DLL и TCZSTD64.DLL, это я в курсе. Равно как и менюшки свои есть, их можно даже посмотреть в моей сборке (на рутрекере раздаю, но в этой теме приводить не буду, ибо варез).
Ну да ладно. Наверное, с облегчением можно констатировать факт, что сейчас уже действительно мало смысла прикручивать сабжа к мультиарку. Тем более, что сам zst формат не умеет ни в атрибуты, ни в >1 файла, ни во что вообще. Простой компрессор без контейнера, как это сделано во всяких там bzip, gzip, xz...
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Раз пошла такая пьянка, завалялся у меня еще один пример, который так и не был доведен до ума. Так что сугубо в качестве примера: как заходить через ExifTool в файлы с мета-данными.

Multiarc.ini

Код: Выделить всё

[ExifTool]
Archiver=%COMMANDER_PATH%\Plugins\wlx\ExifToolView\exiftool.bat
Description=ExifTool
Extension=jpeg 
ID=FF D8 FF, 38 42 50 53, 49 49, 4D 4D, 52 49 46 46, D0 CF 11 E0 A1 B1 1A, 4A 46 49 46, 89 50 4E 47, 47 49 46 38 39, 8B 4A 4E 47
IDPos=0
Start="---------------"
Format0=n++ 
List="%PQA %AQA %O"
ExtractWithPath=
Debug=0
BatchUnpack=0
exiftool.bat

Код: Выделить всё

SetLocal EnableExtensions
CHCP 866
cls

@echo off
@echo ---------------

"%~dp0exiftool.exe" -G -S %1
Аватара пользователя
jentoso
Сообщения: 446
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Есть приложение innounp home site, GitHub, которое продолжает развитие ранее одноимённого приложения innounp 0.5.
Сейчас столкнулся с проблемой при распаковке файлов/папок в названии которых содержится "пробел(ы)" при использовании такого конфига:

Код: Выделить всё

[InnoSetup - unp]
Description="InnoSetup"
Archiver="%$MULTIARC%\EXE\InnoSetup\innounp.exe"
ID=49 6E 6E 6F
IDPos=<SeekID>
Start="^--------------------------------------"
End="^--------------------------------------"
Format0="zzzzzzzzzz  yyyy.tt.dd hh:mm  +n++"
List="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %P -v -m %AQ"
Extract="ConPaste.exe %C /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %P -e -m -c%R %AQ @%LQ"
ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %P -x -m -c%R %AQ @%LQ"
AskMode=0
BatchUnpack=1
Debug=1
IgnoreErrors=0
SearchForUglyDirs=0
SkipDirsInFileList=0
SkipEmpty=0
SkipLIST=1
SkipSfxHeader=1
UnixPath=0
Проблематика возникает в данном моменте "@%LQ", в листинг файл добавляются кавычки, которые innounp не требуются и он может извлечь файлы без них.
Если исключить в конфиге добавление кавычек в именах с пробелами, то возможно уже извлечь файлы, но до момента пока не пройти в папку в названии которой будет пробел.
В данном случае будет ошибка

Код: Выделить всё

---------------------------
Внимание
---------------------------
Похоже, при выполнении команды возникла ошибка, т.к. был получен код возврата 3:
 
ConPaste.exe /s /h\"d:\Download\TC_build\iZotope Trash 1.3.0\iZotope.Trash.v1.3.0-TCD.exe\" /ciZotope.Trash.v1.3.0-TCD.exe /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" D:\TOTALCMD\plugins\wcx\MultiArc\\EXE\InnoSetup\innounp.exe -x -m -c{app}\Presets\Trash Lite \"d:\Download\TC_build\iZotope Trash 1.3.0\iZotope.Trash.v1.3.0-TCD.exe\" @C:\Users\JenTOSO\AppData\Local\Temp\$mltwcx\lst64ED.tmp
 
Полученное значение выше допустимого. Пожалуйста, проверьте конфигурацию текущего типа в файле MultiArc.ini (в том числе параметр %Enn и опцию IgnoreErrors).
---------------------------
ОК    
---------------------------
В данной ошибке смущает вот этот момент

Код: Выделить всё

-c{app}\Presets\Trash Lite \
почему-то на конце через пробел появляется знак "\"
или наоборот, знак "\" появляется перед.

Код: Выделить всё

\"d:\Download\TC_build\iZotope Trash 1.3.0\iZotope.Trash.v1.3.0-TCD.exe\"
Проблема в конфиге, в самом плагине MultiArc или автору innounp требуется "допилить" парсинг листинга (чтобы кавычки тоже мог принимать во внимание или самостоятельно их исключать)?

Рядом с файлом lst64ED.tmp, появляется другой файл zha64EE.tmp, в котором скорее всего и есть причина ошибка

Код: Выделить всё

innounp - the Inno Setup Unpacker, Version 2.65.3 (06.11.2025)

Inno Setup archive:           Lite
Cannot open or read the specified file: "d:\Download\TC_build\iZotope Trash 1.3.0\Lite"
  ==> Не удается найти указанный файл
MultiArc 1.4.4.174
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso писал(а):Если исключить в конфиге добавление кавычек в именах с пробелами, то возможно уже извлечь файлы, но до момента пока не пройти в папку в названии которой будет пробел.
Что имеется в виду под исключением в конфиге: использовать мальнькую "l" вместо большой "L"? Если да, то у меня все работает.
jentoso писал(а):В данной ошибке смущает вот этот момент
Попробуйте совсем убрать "-c%R" из строки распаковки, и без этого ключа должно работать. Моя строка:

Код: Выделить всё

ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p"Введите пароль к дистрибутиву:" "Type in a password" %PQA -x -m %AQA {@%lQ}"
Я не уверен правда, что для всех файлов InnoSetup такая запись подойдет, возможен и обратный эффект. Надо проверять.
Аватара пользователя
jentoso
Сообщения: 446
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Что имеется в виду под исключением в конфиге: использовать мальнькую "l" вместо большой "L"? Если да, то у меня все работает.
Имелось ввиду вот эта часть конфига "@%LQ", где Q заключает в кавычки длинные имена с пробелами.
Новая версия innounp при работе с листнг-файлом не учитывает кавычки, они ей не требуются. Автор ответил, что автоматическое удаление кавычек в списке файлов в следующем обновлении реализует.
Попробуйте совсем убрать "-c%R" из строки распаковки, и без этого ключа должно работать.
В этом нет необходимости
-cDIR - specifies that DIR is the current directory in the installation
%R - Target subdirectory inside archive
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso писал(а):В этом нет необходимости
Ну, если у меня все работает, то может быть необходимость таки есть? )
jentoso писал(а):-cDIR - specifies that DIR is the current directory in the installation
%R - Target subdirectory inside archive
И?..

Я с утра тоже в справку заглядывал:
%l - Filelist with short file names
Однако вместо списка с короткими путями получаются пути без кавычек.

Вообще-то я думал, что модификатор Q применяется только к путям передаваемых параметров (т.е. непосредственно к путям командной строки, а не путям в списке), но можно и так:

Код: Выделить всё

ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p"Введите пароль к дистрибутиву:" "Type in a password" %PQA -x -m %AQA @%LA"
Эта строка у меня тоже работает.
Аватара пользователя
jentoso
Сообщения: 446
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Orion9

Код: Выделить всё

ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %PQA -x -m %AQA {@%lQ}"

Код: Выделить всё

ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %PQA -x -m %AQA @%LA"
Да, оба варианта рабочих. Все файлы/папки содержащие пробелы без проблем извлекаются.
Конечно есть еще одна проблемка, но здесь уже видимо ничего не поделать. Внутри есть файл, который в имени содержит такой символ
Изображение
а видится в ТС и командной строке
Изображение

Добавлено спустя 42 минуты:
И?..

Я с утра тоже в справку заглядывал:
Вообще-то я думал, что модификатор Q применяется только к путям передаваемых параметров (т.е. непосредственно к путям командной строки, а не путям в списке)
Вот и я в справку глянул и решил, что l вместо L не пойдёт, а вышло оказывается иначе
Однако вместо списка с короткими путями получаются пути без кавычек.
Благодарю.
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso писал(а):Конечно есть еще одна проблемка, но здесь уже видимо ничего не поделать.
Увы, ничего. Только плуг переделывать, а кто этим займётся, MVV? Его профиль, как и профиль любого цифрового бога, который выполнил свою миссию на этом форуме на этой земле, давно загружен в виртуальное облако, где имеет возможность наслаждаться трехмерными голограммами и пленящим звуком Dolby Atmos :mrgreen:
jentoso писал(а):Вот и я в справку глянул и решил, что l вместо L не пойдёт, а вышло оказывается иначе
Да это больше на баг тянет. Лучше использовать второй вариант с Q, а то не известно, где это может аукнуться. Просто я хотел посмотреть, будет ли формироваться список с короткими именами, а оказалось, что нет. Вообще справка довольно муторно написано, в свое время пришлось с ней несколько дней возиться, очень хотелось сделать рабочий конфиг на upx, который нигде не удавалось найти. В итоге сделал, но крышу чуть не сорвало.
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso
Я почитал топик на руборде и согласен с вами: теперь больше нет уверенности при входе в инсталлятор, что он корректно отобразиться и распакуется. По этому поводу Destiny уместно предложил, что нужно либо добавлять новый ключ в MultiArc, либо писать отдельный плагин для работы с InnoSetup.

Но не похоже, что MVV в ближайшее время будет готов взяться за доработку MultiArc, поэтому пришла идея сделать небольшую обертку для innounp.exe в виде батника и скрипта на Autorun, чтобы хотя бы была возможность видеть потенциально проблемные файлы.

В принципе, если сильно загнаться, можно сделать и распаковку, но я подумал, что в этом нет пока смысла. Сейчас скрипт просто анализирует содержимое inno-файла, и если файл содержит юникодные имена, информирует об этом при входе или распаковке. Сообщение не мешает, так как оно отображается всего секунду, но не заметить его будет сложно.

Можно не устанавливать батник и не вносить изменения в MultiArc.ini — использовать только один скрипт для анализа содержимого, повесив его на нужную комбинацию. Сейчас такой комбинацией является Alt+PgDown, но можно изменить. Скрипт написан на Autorun, т.ч. понадобится и Autorun.
Autorun

Код: Выделить всё

Global gInnoFile, gInnoList

RegisterCommand 60039 TestInno

SetHotkeyAction /K:A /H:PGDN TestInno

Func TestInno()
    Local bAlt = IsPressed(0x12)
    Local T1 = GetUptime(), T2 = T1, T3
    Local sInno = COMMANDER_PATH & "\Plugins\arc\InnoSetup\innounp.exe"
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If Not FileExist(sFile) Then     
       If StrPos(sFile, gInnoFile) Then sFile = gInnoFile
    Else 
       gInnoFile = sFile
    EndIf
    If Not FileExist(sFile) Then 
       ShowHint("File doesn't exist " & sFile)
       Return
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Can't process directory " & sFile)
       Return
    EndIf
    Local a = List(), u = List()    
    Local ansi, utf8, wrong, msg, i = 0
    #ProcessExecGetOutput ansi %sInno% ' -v -m "%sFile%"'      
    ProcessExecGetOutput /C:65001 utf8 %sInno% ' -v -m -u "%sFile%"'
    ansi = WideToAnsi(utf8)
    a.Text = ansi   
    u.Text = utf8
    For i = 0 to u.Count - 1
       If u[i] <> a[i] Then wrong &= u[i] & auCRLF
    Next
    Free(a, u)
    T3 = Round(GetUptime() - T1, 0) / 1000
    T3 = "Operation time: " &  StrFormat("%.3f", T3) & " sec"    
    If wrong = "" Then
       If bAlt Then
          If i > 10 Then
             MsgBox("This installer does not contain unicode filenames." & auCRLF & auCRLF & T3, "InnoSetup", 64)
          Else
             MsgBox(ansi & auCRLF & T3, "InnoSetup", 48)          
          EndIf   
       EndIf   
       Return
    EndIf
    Local w = List()
    w.Text = StrTrim(wrong)
    For i = 0 to w.Count - 1
       If i < 10 Then 
          msg &= w[i] & auCRLF
       Else
          msg & = auCRLF& auCRLF & "And " & w.Count - 1 - i & " more."
          Break 
       EndIf
    Next
    Free(w)
    T3 = Round(GetUptime() - T1, 0) / 1000
    T3 = "Operation time: " &  StrFormat("%.3f", T3) & " sec"     
    If bAlt Then
       MsgBox("This installer contains unicode filenames:" & auCRLF & auCRLF & msg & auCRLF & T3, "InnoSetup", 48)       
    Else          
       ShowRedHint("Unicode warning")
    EndIf
EndFunc

Func ShowRedHint(HintText)
    SetHintParam("ShowHint", "Font", 15, "Arial")
    SetHintParam("ShowHint", "BackColor", 0xFF0000)
    SetHintParam("ShowHint", "Text", 0xFFFFFF)
    ShowHint(HintText, 0, 0, 1000, 1)
    WinAlign(LAST_HINT_WINDOW)    
    Sleep(100)
    SetHintParam("ShowHint", "Reload") 
EndFunc

Func WideToAnsi(String)
    Local sAnsi, nSize = StrLen(String)
    Local buf = Buffer(nSize)     
    buf.Zero()
    buf.SetStr(String, 0, nSize, "ANSI")
    Local sAnsi = buf.GetStr(0, nSize, "ANSI")       
    Free(buf)
    Return sAnsi  
EndFunc
Если нужно, чтобы при входе в инсталлятор скрипт автоматически предупреждал об юникоде:
inno.bat
::@echo off
SetLocal EnableExtensions
::chcp 866
cls

if %~z2 EQU 0 goto End
if /i "%1" =="l" goto List
if /i "%1" =="e" goto Extract
exit

:List

"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "tcm(60039,1)"
::echo Type in a password
"%~dp0innounp.exe" -v -m -u %2

if %errorlevel% == 0 goto End
exit

:Extract

"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "sendmsg(findwnd(`AUTORUN_WINDOW`),12,0,`SetVar gInnoFile %2`)"
"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "sendmsg(findwnd(`AUTORUN_WINDOW`),12,0,`SetVar gInnoList %3`)"
::"%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe" /ef "tcm(60039,1)"
::pause 1
"%~dp0innounp.exe" -x -m -u %2 @%3

:End
Multiarc.ini
[InnoAutorun]
Description="InnoSetup"
Archiver="%COMMANDER_PATH%\Plugins\arc\InnoSetup\inno.bat"
Extension=exe
ID=49 6E 6E 6F 20 53 65 74 75 70
IDPos=<SeekID>
Start="^--------------------------------------"
End="^--------------------------------------"
Format0="zzzzzzzzzz yyyy tt dd hh mm n++"
List="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %PQA l %AQA"
ExtractWithPath="ConPaste.exe /s /h%AQ /c%AWQ /p\"Введите пароль к дистрибутиву:\" \"Type in a password\" %PQA e %AQA %LA"
Debug=0
BatchUnpack=1
Как видно из батника и ini, понадобится утилита TCFS2 и корректно указанные пути.

От себя скажу, что результат получился нормальный. Это намного лучше, чем когда вообще ничего не видно.
Аватара пользователя
jentoso
Сообщения: 446
Зарегистрирован: Чт дек 20, 2007 01:36

Сообщение jentoso »

Orion9
Сообщение не мешает, так как оно отображается всего секунду, но не заметить его будет сложно.
Т.е. окно с сообщением должно закрыться? У меня оно висит, пока не нажму ОК.
Но в целом скрипт получился отличным:!:

P.S. Окно появляется, если войти по Alt+PgDown, по команде 60039 появляется и исчезает надпись "Unicode warning".
TC 11.58 combo, Windows 11 x64
Аватара пользователя
Orion9
Сообщения: 1313
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

jentoso
Нет, у вас все правильно работает. Под исчезающим сообщением я имел в виду как раз "Unicode warning". А сообщение по Alt+PgDown только кликом или ESC закрывается.

Раньше мне намного чаще приходилось заходить и распаковывать инсталляторы, сейчас потребность стала реже. Но если вы что-то заметите, то сообщайте конечно же :D
Ответить