Страница 13 из 36
Добавлено: Вт июн 27, 2017 00:32
Flasher
Skif_off писал(а):Аргументы сомнению какие-нибудь есть?
Зачем сомнению аргументы? Аргументы должны быть у утверждения. Сомнения строятся на предположениях, иначе бы не было смысла предлагать проверить. Только тебе-то какая разница? Ты же этим не пользуешься.
Iori
Давай попробуем сделать. Только сперва мне нужна версия библиотеки, включая битность. Сам файл нужен. У меня 6.1.7601.17514 (win7sp1_rtm.101119-1850).
Iori писал(а):Решение очень хорошее.
А что там хорошего? Это же обычная регистрация.
Добавлено: Вт июн 27, 2017 02:37
Iori
Flasher
А что там хорошего? Это же обычная регистрация.
А нельзя ли сделать что-бы сам скрипт запускал
, если не находит в реестре метку msado15.dll.
Давай попробуем сделать.
Спасибо за предложение. Способ который подсказал
Skif_off, я скорее всего смогу сам осуществить.
У меня в TC есть кнопки для 7зип которые запускаются через батник. Работают без проблем. По этому я всегда могу использовать их там. Идея была убрать лишние кнопки и оставить только твой скрипт, но так что бы он работал универсально везде. Если это получиться без особо больших затрат, то хорошо, а если нет, то не беда.
Добавлено: Вт июн 27, 2017 09:09
Flasher
Iori
Просто надо выбрать файл и выложить сюда. Чтобы работало на разных битностях, проще - сразу 32-битный. Есть ещё идея заменить на ChilkatCharset.dll (правда он Trial), только тогда мне придётся ещё скрипт править.
Добавлено: Вт июн 27, 2017 10:37
Skif_off
Flasher писал(а):Зачем
Как-то много слов, предположу, что предположение на пустом месте.
Flasher писал(а):Чтобы работало на разных битностях проще сразу 32-битный.
Не совсем проще: подсистему WOW64 в WinPEx64 добавляют нередко, но она бывает не исчерпывающей. Сталкивался с проблемами, тот же AkelPad при прочих равных: в AkelPad х64 всё работает, а AkelPad х86 скрипты выдают ошибку (хотя сами по себе файлы могут присутствовать, но без регистрации). Если затачивать под конкретную сборку, то лучше уточнить этот момент. Или вариант ниже.
Iori
Если прикручиваете к WinPE свою сборку ТС, то, может быть, через плагин AutoRun? В нём есть и
FileExist (проверить наличие файлов), и
RegRead (проверить регистрацию - один из ключей, в значении которого есть имя библиотеки), и
ShellExec (зарегистрировать при необходимости). И разрядность ОС можно проверить. Если ТС будет использоваться и не в WinPE, то тогда нужно как-то это предусмотреть, например, наличие PECMD в "%WinDir%\System32" или LetterSwap (тут могут быть варианты *.au3, *.a3x, *.exe).
Хотя, наверное, через 7zSFX попроще всё это разрулить, включая разрядность...
Добавлено: Вт июн 27, 2017 11:09
Flasher
Skif_off писал(а):предположу, что предположение на пустом месте.
Уверяю, что твоё предположение беспочвенно. Я не находил в сети описание такой работы с WinPE, натыкался только на какие-то проблемы с манифестами.
Skif_off писал(а):Если затачивать под конкретную сборку, то лучше уточнить этот момент.
Можно и уточнить. А можно и под обе битности подогнать.
Skif_off писал(а):Или вариант ниже.
Вариант не ахти.
Добавлено: Вт июн 27, 2017 18:23
Iori
Flasher
Просто надо выбрать файл и выложить сюда
От десятки х64 (10.0.15063.296) 32 + 64бит.
http://rgho.st/8Cl4qvqJJ
Если прикручиваете к WinPE свою сборку ТС, то, может быть, через плагин AutoRun?
Как вы уже сказали, через 7zSFX будет удобнее.
Я говорю что у меня есть кнопки 7zip для Winpe. Я думал что подогнать скрипт, так что-бы работал под WinPE не будет тяжело.
Спасибо за альтернативное решение проблемы.
Добавлено: Ср июн 28, 2017 15:42
Flasher
Iori
Решил по-другому (без ADO) сделать. Не так быстро как раньше, но, возможно, устроит:
[cut="Версия +WinPE"]
Код: Выделить всё
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
' Распаковка выбранных архивов и/или архивов в структуре выбранных каталогов
' в одноимённые папки рядом с архивами (при наличии в них более одного элемента)
' c автоматическим переходом в случае распаковки одного архива
' Условие: необходима текущая версия утилиты 7z.exe
' Параметры:
' 1. %WL (обязательный)
' 2. <расширения архивов (в т.ч. двойные) через "|"> ("" - все поддерживаемые)
' 3. <флаг распаковки одиночных элементов без подкаталогов: 1>
' 4. <пропустить/перезаписать существующие/переименовать извлекаемые файлы: s/a/u>
' 5. <флаг удаления распакованных архивов: 1>
' Примеры: %WL | %WL "" 1 | %WL 7z|7zip|arj|bzip2|rar|tar.bz2|zip | %WL "" 1 s 1
Option Explicit : Dim Z7
'••••••••• Путь к утилите 7z.exe •••••••••
Z7 = "%COMMANDER_PATH%\Utils\7-Zip\7z.exe"
'•••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••
Dim A, C, Filt, One, Mode, Del, List, WSS, FSO, XML, ShA, Reg, TF, F, Ch, Cn, It
Set A = WSH.Arguments : C = A.Count: If C = 0 Then WSH.Quit
If C > 1 Then Filt = LCase(A(1)) : If C > 2 Then One = A(2)
If C > 3 Then Mode = "-ao"& A(3) : If C > 4 Then Del = A(4)
List = A(0) : Set WSS = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set XML = CreateObject("Msxml2.DOMDocument")
Set ShA = CreateObject("Shell.Application")
Set Reg = New Regexp
Reg.IgnoreCase = True : Reg.Pattern = "^(001|7z(|ip)|a|apm|arj?|bz(|ip)2|cab|cpio|ch[iqmw]" &_
"|cramfs|deb|dmg|docx?|e(sd|pub|xe|xt[234]?)|fat|gz(|ip)|hfsx?|hx[sirqw]|ihex|img|iso|jar|" &_
"li[bt]|l(zh|ma)|lha|mbr|ms(i|lz|sp)|mub|n(si|tf)s|od[st]|qcow(|2c?)|r00|rar|rpm|pkg|ppmd|" &_
"ppt|squashfs|scap|swm|t[agx]z|tar|tbz2?|u(d|efi)f|vdi|vhd|vmdk|wim|x(ar|lsx?|pi|z)|z|zipx?)$"
TF = FSO.GetSpecialFolder(2) & "\" & FSO.GetTempName
With FSO.OpenTextFile(List,,,-1)
Do : F = Trim(.ReadLine)
If F <> "" Then If FSO.FileExists("\\?\" & F) Then _
ForFile F, Ch, It, Cn Else ForFolder F, Ch, It, Cn
Loop Until .AtEndOfStream : .Close
End With
If Ch > 1 Then WSS.Popup "Распаковка завершена!", 1.4 , " Результат", 64
If Ch = 1 Then
If Cn > 1 And FSO.FolderExists(It) Then It = FSO.GetParentFolderName(It)
WSS.Exec "%COMMANDER_EXE% /A /S /O /L=""" & Replace(It, "\\?\", "") & """"
End If : If FSO.FileExists(List) Then FSO.DeleteFile List
If FSO.FileExists(TF) Then FSO.DeleteFile TF
Sub ForFile(Arch, T, F1, Sum)
Dim Ext, BN, Ex, Arr, Item : Ext = LCase(FSO.GetExtensionName(Arch))
BN = FSO.GetBaseName(Arch) : Ex = LCase(FSO.GetExtensionName(BN))
Ex = Len(Ex) * InStr("|" & Filt & "|", "|" & Ex & "." & Ext & "|")
If (Filt = "" Or Ex Or InStr("|" & Filt & "|", "|" & Ext & "|")) And Reg.Test(Ext) Then
WSS.Run "%comspec% /c chcp 65001&&echo off>" & TF & "&echo ^<?xml version=""" &_
"1.0"" encoding=""utf-8""?^>^<a^>>>" & TF & "&&""" & Z7 & """ l -slt" &_
" """ & Arch & """ -sccUTF-8>>" & TF & "&&echo ^</a^>>>" & TF, 0, True
XML.Load TF : Arr = Split(XML.Text, "----------" & vbLf)(1)
Arr = Filter(Split(Arr, vbLf), "Path = ") : XML.Abort
Sum = Ubound(Arr) + 1 : If Sum > 0 Then Item = Split(Arr(0), " = ")(1)
If Sum < 1 And Ext = "zip" And Len(Arch) < 260 Then
Dim Items : Set Items = ShA.NameSpace(Arch).Items
Sum = Items.Count : If Sum Then Item = Items.Item(0)
End If
If Sum > 0 Or FSO.GetFile(LPath(Arch)).Size Then
Dim P, Fd, NF : P = FSO.GetParentFolderName(Arch)
Fd = P & "\" & BN
If Sum = 1 And (One = "1" Or BN = Item) Then NF = P Else NF = Fd
F1 = NF & "\" & Item
WSS.Run """" & Z7 & """ x """ & Arch & """ -o""" &_
NF & """ " & Mode & " -y -p", 0, True : T = T + 1
LPath(F1) : LPath(Fd) : LPath(Arch)
If FSO.FileExists(F1) Then
If Del = 1 And Sum = 1 Then FSO.DeleteFile Arch, 1
ElseIf FSO.FolderExists(F1) Then
If FSO.GetFolder(F1).Size Then
If Del = 1 And Sum = 1 Then FSO.DeleteFile Arch, 1
Else FSO.DeleteFolder F1, 1
End If
ElseIf FSO.FolderExists(Fd) Then
If FSO.GetFolder(Fd).Size Then
If Del = 1 Then FSO.DeleteFile Arch, 1
Else FSO.DeleteFolder Fd, 1
End If : F1 = Fd
End If
End If
End If
End Sub
Sub ForFolder(Fold, T, F1, Cnt)
Dim N : Set Fold = FSO.GetFolder(LPath(Fold))
For Each N In Fold.SubFolders : ForFolder N.Path, Ch, It, Cnt : Next
For Each N In Fold.Files : ForFile N.Path, Ch, It, Cnt : Next
End Sub
Function LPath(Obj)
LPath = Obj : If Len(Obj) > 259 And Left(Obj, 1) <> "\" Then LPath = "\\?\" & Obj
End Function
[/cut]
Добавлено: Ср июн 28, 2017 20:07
Iori
Flasher
Ах Молодец

Спасибо Огромное.
Проверил в WinPE, работает. Если и медленнее работает как ты говоришь, то на долю секунды, не больше.
Заметил что когда скрипт распаковывает 7z sfx exe файл, то потом не переходит в папку с распакованными файлами.
Добавлено: Ср июн 28, 2017 20:19
Flasher
Iori
Пож-та. Ну, я ощущаю поболее 1 дс.
Проверил sfx (внути неск. файлов) - переход есть. Скинь свой файл.
Добавлено: Ср июн 28, 2017 20:28
Iori
Добавлено: Ср июн 28, 2017 20:56
Flasher
Iori
Вроде поправил. Но вообще это и TCKB-шной версии касается.
Добавлено: Ср июн 28, 2017 21:04
Iori
Flasher
Работает

А версия которая поддерживает WinPE, не будет на TCKB?
Всё-таки скрипт теперь универсальнее стал.
Добавлено: Ср июн 28, 2017 21:14
Flasher
Iori
Не, не будет. Иначе бы только заменой текущего и обошлось. Скорость для меня приоритетней, да без темпизации.
Добавлено: Ср июн 28, 2017 21:26
Iori
Flasher
Понятно. Но ради интереса надо будет сделать тест скорости.
PS:
Вот такая ошибка выскакивает при попытке распаковки вот этого архива.
http://www.tweaking.com/files/setups/tw ... ir_aio.zip
Код: Выделить всё
Line:56
Char:19
Error: Subscript out of range [number:1]
code: 800A0009
Я полагаю дело в точках.
Добавлено: Чт июн 29, 2017 21:26
Flasher
Iori
Мда. Вот тебе, бабушка, и Iori'ev (универсальный) день...

Дело не в точках, а в амперсандах в путях/именах элементов архива. Пофиксить можно только заменой новоиспечённого метода чтения юникодного имени, к которому переходим. Есть, в принципе, в запасе один вариант, но он ещё помедленнее будет.
P.S.: Между ответами ровно сутки.
