![]() |
копирование файлов по hash-имени из HEX исходного файла
всем привет,
1. имеется папка с кучей файлов. у файлов вместо имени hash-абракадабра типа: 000ec4d858ebbaa80621fc19a608599f.chunk или aa8d9cd800e0c17bc5b03d488ab17572.chunk 2. имеется набор файлов с расширением EBX (и нормальными именами), в хексе которых эти hash-имена. задача вот такая вот: кидаем EBX на BAT файл и соответствующие файлы .chunk копируются к исходному EBX и, было бы круто, эти скопированные .chunk файлы переименовывать в имя EBX с числовым индексом. подскажите как такое реализовать. p.s.: обнаружил, что после каждого hash-имени внутри EBX идёт hex-значение: FFFFFFFF |
Tosyk, как понять, что есть:
Цитата:
Цитата:
Цитата:
|
прошу прощения, у меня голова садовая
вот примеры: https://drive.google.com/file/d/16r6...ew?usp=sharing возможно, когда вы посмотрите на них у вас не останется вопросов |
Цитата:
|
если вы откроете любой из двух файлов .MeshSet из папки EBX моего примера в HEX редакторе то там перед каждым значением FFFFFFFF будет 32-ух значное имя файла из папки CHUNK моего же примера.
нужно просканировать .MeshSet выявить список всех таких имён и скопировать файлы с соответствующими именами из папки CHUNK в то место где лежит исходный .MeshSet например для файла head_cole_mp_mesh 90110000000000001001000070009400.MeshSet список таких имён будет таким: Код:
305B5D766DEEDE8081AF49D0A42426CF Код:
head_cole_mp_mesh 90110000000000001001000070009400_01.chunk |
|
вообще это я сам придумал. если есть какая-то возможность понять где в этом файле (в данном случае .MeshSet) будут эти 32-ух значные имена НЕ ориентируясь на FFFFFFFF то это было бы просто отлично
edit: сейчас у меня в папке CHUNK 32000 файлов |
Tosyk, хорошо бы. Но для этого нужно знать или иметь описание внутреннего формата этих файлов. Что это вообще такое?
|
Вложений: 1
ebx - это общий игровой формат движка frostbite. довольно разносторонний. там может всё что угодно содержаться, но что меня интересует так это только линки на эти 32-ух значные имена.
вот что то похожее на описание: https://pastebin.com/rGpBFwAV в аттаче я прикрепил подобный файлу .MeshSet файл для линка к текстуре. из него можно узнать имя 4D42EF837BFB4F9CBD9E664F7959E7A3 и это ещё один файл из папки CHUNK только это уже будет текстура. |
Tosyk, ну, вот, попробуйте в первом приближении (на PowerShell):
Скрытый текст
Код:
$sRootFolder = 'C:\Мои проекты\0167' У меня вышли такие результаты
![]() ![]() |
извините, а как пользоваться?
edit: и ещё, я хотел вот так делать: перетаскиваю .MeshSet (это по сути тот же EBX) файл на исполняемый .bat и все нужные .chunk копируются в папку к исходному .MeshSet. такое можно с ним делать? |
Цитата:
Код:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned Код:
powershell.exe -file "C:\Мои проекты\0167\Untitled1.ps1" Цитата:
Цитата:
|
*.MeshSet - это только один из форматов EBX файлов. у меня две папки CHUNKS и BUNDLES. про CHUNKS я уже рассказал, а в папке BUNDLES довольно конкретная и сложная структура файлов с правильными именами и своими расширениями. 60% всех файлов в BUNDLES это .ebx файлы, остальные это .MeshSet/.dxTexture/.iTexture и т.д. в большинстве своём это просто скрипты и линки на файлы из папки CHUNKS. Иногда попадаются другие типы .ebx файлов, полноценные, имеющие, например, внутри 3д геометрию, другие настройки физики.
мне не нужны все эти файлы, моя цель сейчас это выбрать нужные мне .MeshSet и перетягиванием на исполняемый скрипт получить копии файлов из папки CHUNKS. Если всё будет хорошо работать, возможно можно будет попробовать коллекционировать таким образом .chunk файлы для других типов как то .dxTexture/.iTexture и т.д. |
Tosyk, ещё раз: где искать соответствующие файлы *.chunk по отношению к файлу .MeshSet? Вот мы перетянули на скрипт файл .MeshSet, получили в скрипте полный путь к нему. Где искать файлы *.chunk относительно пути этого файла .MeshSet?
|
файлы .chunk ищем по указанному адресу, может быть любой. безотносительно файлов .MeshSet
|
Цитата:
|
так нужно этот путь в скрипте указать
|
Tosyk, указать в скрипте? Тогда в чём смысл перетаскивания файла на скрипт? Совершенно не понимаю.
Впрочем, как скажете. Можете задавать путь к файлам *.chunk тупо в скрипте (умолчанием второго аргумента). C:\Мои проекты\0167\Sample.ps1
Код:
param( C:\Мои проекты\0167\RunPowerShell.vbs
Код:
Option Explicit Поскольку умолчальным глаголом для .ps1 является отнюдь не «Выполнить с помощью PowerShell» (и что я менять, в общем-то, не советую), то используем промежуточный скрипт WSH, на который и надо перетаскивать файл .MeshSet. Не забудьте поправить все пути в скриптах и сами имена скриптов на свои. |
т.е. скрипт RunPowerShell.vbs использует скрипт Sample.ps1 и перетаскивать исходный файл нужно именно на RunPowerShell.vbs?
|
Tosyk, да.
|
что-то не может найти ни одного файла.
все пути прописал правильно, проверил. все чанки у меня в одной папке, до которой я указываю путь. беру файл: D:\_r\fb\_ex_test\bundles\res\characters\heads\sp_brady\sp_brady_head_mesh 00160000000000003801000070009400.MeshSet и кидаю его на ps_chunks0_search.vbs. в итоге мигает чёрное окно с красным текстом. правильный чанк по пути имеется. |
Tosyk, ну, если у меня работает, а у Вас нет, значит, явно что-то не так.
Покажите Ваш код PowerShell с исправленными путями. Покажите Ваш код ps_chunks0_search.vbs. Покажите содержимое каталога с «все чанки у меня в одной папке, до которой я указываю путь». Упакуйте в архив Ваш sp_brady_head_mesh 00160000000000003801000070009400.MeshSet и приложите к сообщению. Покажите скриншот с: Цитата:
|
я бы сделал скриншот, но как? окно ведь мигает. можно как-то запаузить его?
|
Добавьте в самый конец Sample.ps1:
Код:
Read-Host | Out-Null |
в окошке было написано, что у меня компьютере не разрешено выполнение таких скриптов. я дал разрешение и всё заработало.
несколько вопросов: 1. можно ли сделать поиск чанков рекурсивным? - если у меня в папке CHUNK будет структура сложнее одной папки 2. можно ли сделать чтобы скрипт не заменял скопированный чанк если он уже есть в папке а именовал его как-то с суфиксом? 3. можно ли добавить возможность копирования чанков с их оригиналными именами рядом с исходным файлом в папку CHUNKS? 4. можно ли как-то исбежать шаг разрешения выполнения подобных скриптов на компе? вообще это очень крутая штука, работает как надо, спасибо вам огромное! много лет не решался написать по этому поводу сюда p.s.: можно ли как-то транслитировать этот код в auto-it и зашить в exe? |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
|
Tosyk, чем больше я пытаюсь осмыслить все озвученные Вами хотелки, тем меньше они мне нравятся. Если реализовать всё задуманное — получится полная каша.
В общем — рекурсивный поиск и нумерация найденных дубликатов. Существующие файлы по месту назначения по-прежнему будут переписываться, не вижу никакого смысла менять данное поведение. Скрытый текст
Код:
param( |
вроде бы начало работать, но через 2 минуты выдало эксепшены:
Скрытый текст
[D:\_r\fb\interstate_76_premium_pc\_ex_test\bundles\res\characters\heads\head01\
head01_enemy_mesh 70110000000000001001000070009400.MeshSet] Offset: 212 Found file name: 1689A37995A680D6AABEDA914DD62F89 File [D:\_r\fb\interstate_76_premium_pc\_ex_test\chunks\chunks0\1689a 37995a680d6aabeda914dd62f89.chunk] found! Copy to [D:\_r\fb\interstate_76_premium_pc\_ex_test\bundles\res\characte rs\heads\head01] as [head01_enemy_mesh 70110000000000001001000070009400_01_01.ch unk]. Исключение при вызове "Copy" с "3" аргументами: "Файл 'D:\_r\fb\interstate_76_p remium_pc\_ex_test\chunks\1689A37995A680D6AABEDA914DD62F89.chunk' не найден." D:\_r\fb\interstate_76_premium_pc\tools\ps_chunks.ps1:47 знак:64 + [System.IO.File]::Copy($sChunkFile, "$($oSourceFile.D ire ... + ~~~~~~~~~~~~~~ ~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FileNotFoundException Offset: 388 Found file name: 4359EB953C735D805EE6F7B155BC403B File [D:\_r\fb\interstate_76_premium_pc\_ex_test\chunks\chunks1\4359e b953c735d805ee6f7b155bc403b.chunk] found! Copy to [D:\_r\fb\interstate_76_premium_pc\_ex_test\bundles\res\characte rs\heads\head01] as [head01_enemy_mesh 70110000000000001001000070009400_02_01.ch unk]. Исключение при вызове "Copy" с "3" аргументами: "Файл 'D:\_r\fb\interstate_76_p remium_pc\_ex_test\chunks\4359EB953C735D805EE6F7B155BC403B.chunk' не найден." D:\_r\fb\interstate_76_premium_pc\tools\ps_chunks.ps1:47 знак:64 + [System.IO.File]::Copy($sChunkFile, "$($oSourceFile.D ire ... + ~~~~~~~~~~~~~~ ~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FileNotFoundException Offset: 564 Found file name: B59CF3BB396E1BC16C1585473170565F File [D:\_r\fb\interstate_76_premium_pc\_ex_test\chunks\chunks1\b59cf 3bb396e1bc16c1585473170565f.chunk] found! Copy to [D:\_r\fb\interstate_76_premium_pc\_ex_test\bundles\res\characte rs\heads\head01] as [head01_enemy_mesh 70110000000000001001000070009400_03_01.ch unk]. Исключение при вызове "Copy" с "3" аргументами: "Файл 'D:\_r\fb\interstate_76_p remium_pc\_ex_test\chunks\B59CF3BB396E1BC16C1585473170565F.chunk' не найден." D:\_r\fb\interstate_76_premium_pc\tools\ps_chunks.ps1:47 знак:64 + [System.IO.File]::Copy($sChunkFile, "$($oSourceFile.D ire ... + ~~~~~~~~~~~~~~ ~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FileNotFoundException Offset: 740 Found file name: 2D70DB36CE8988E189CEBD5F24B75895 File [D:\_r\fb\interstate_76_premium_pc\_ex_test\chunks\chunks1\2d70d b36ce8988e189cebd5f24b75895.chunk] found! Copy to [D:\_r\fb\interstate_76_premium_pc\_ex_test\bundles\res\characte rs\heads\head01] as [head01_enemy_mesh 70110000000000001001000070009400_04_01.ch unk]. Исключение при вызове "Copy" с "3" аргументами: "Файл 'D:\_r\fb\interstate_76_p remium_pc\_ex_test\chunks\2D70DB36CE8988E189CEBD5F24B75895.chunk' не найден." D:\_r\fb\interstate_76_premium_pc\tools\ps_chunks.ps1:47 знак:64 + [System.IO.File]::Copy($sChunkFile, "$($oSourceFile.D ire ... + ~~~~~~~~~~~~~~ ~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : FileNotFoundException Press Enter to close... |
Поменял одну неправильную строку и убрал одну лишнюю:
Скрытый текст
Код:
param( Как теперь? |
всё классно работает!
можете ли добавить копирование эти же чанков с их оригинальными именами в папку CHUNKS рядом с исходным файлом? для консистентности |
Tosyk, не мытьём, так катаньем, да ;)?
Добавьте: Код:
if(-not [System.IO.Directory]::Exists("$($oSourceFile.DirectoryName)\CHUNKS")) { Код:
[System.IO.File]::Copy($_.FullName, "$($oSourceFile.DirectoryName)\$sDestFileName", $true) |
Время: 13:30. |
Время: 13:30.
© OSzone.net 2001-