Показать полную графическую версию : копирование файлов по hash-имени из HEX исходного файла
всем привет,
1. имеется папка с кучей файлов. у файлов вместо имени hash-абракадабра типа: 000ec4d858ebbaa80621fc19a608599f.chunk или aa8d9cd800e0c17bc5b03d488ab17572.chunk
2. имеется набор файлов с расширением EBX (и нормальными именами), в хексе которых эти hash-имена.
задача вот такая вот: кидаем EBX на BAT файл и соответствующие файлы .chunk копируются к исходному EBX и, было бы круто, эти скопированные .chunk файлы переименовывать в имя EBX с числовым индексом.
подскажите как такое реализовать.
p.s.: обнаружил, что после каждого hash-имени внутри EBX идёт hex-значение: FFFFFFFF
Tosyk, как понять, что есть:
в хексе которых эти hash-имена. »
копируются к исходному EBX »
переименовывать в имя EBX с числовым индексом »
? Где образцы тех и других файлов, упакованных в архив? Где примеры того, что есть, и что надо получить?
прошу прощения, у меня голова садовая
вот примеры:
https://drive.google.com/file/d/16r6o0r46Any3ONqnE08PH64cFSq-RlXp/view?usp=sharing
возможно, когда вы посмотрите на них у вас не останется вопросов
возможно, когда вы посмотрите на них у вас не останется вопросов »
Лично мне понятней не стало. Вы не ответили на первый и последний вопросы.
если вы откроете любой из двух файлов .MeshSet из папки EBX моего примера в HEX редакторе то там перед каждым значением FFFFFFFF будет 32-ух значное имя файла из папки CHUNK моего же примера.
нужно просканировать .MeshSet выявить список всех таких имён и скопировать файлы с соответствующими именами из папки CHUNK в то место где лежит исходный .MeshSet
например для файла head_cole_mp_mesh 90110000000000001001000070009400.MeshSet список таких имён будет таким:
305B5D766DEEDE8081AF49D0A42426CF
88AA965A017628C5D9180DBE0A938819
65FEA349ABF38F538453CEBDA3242277
479EAF685E58B752F331F73A4A28586F
а в папке CHUNK лежат файлы с такими же именами - нужно их скопировать в папку к этому head_cole_mp_mesh 90110000000000001001000070009400.MeshSet и переименовать в
head_cole_mp_mesh 90110000000000001001000070009400_01.chunk
head_cole_mp_mesh 90110000000000001001000070009400_02.chunk
head_cole_mp_mesh 90110000000000001001000070009400_03.chunk
head_cole_mp_mesh 90110000000000001001000070009400_04.chunk
нужно просканировать .MeshSet выявить список всех таких имён »
Ориентируемся только на то, что Вы сказали:
перед каждым значением FFFFFFFF будет 32-ух значное имя файла »
?
вообще это я сам придумал. если есть какая-то возможность понять где в этом файле (в данном случае .MeshSet) будут эти 32-ух значные имена НЕ ориентируясь на FFFFFFFF то это было бы просто отлично
edit: сейчас у меня в папке CHUNK 32000 файлов
Tosyk, хорошо бы. Но для этого нужно знать или иметь описание внутреннего формата этих файлов. Что это вообще такое?
ebx - это общий игровой формат движка frostbite. довольно разносторонний. там может всё что угодно содержаться, но что меня интересует так это только линки на эти 32-ух значные имена.
вот что то похожее на описание: https://pastebin.com/rGpBFwAV
в аттаче я прикрепил подобный файлу .MeshSet файл для линка к текстуре. из него можно узнать имя 4D42EF837BFB4F9CBD9E664F7959E7A3 и это ещё один файл из папки CHUNK только это уже будет текстура.
Tosyk, ну, вот, попробуйте в первом приближении (на PowerShell):
$sRootFolder = 'C:\Мои проекты\0167'
$sEBXSubFolder = Join-Path -Path $sRootFolder -ChildPath 'EBX'
$sCHUNKSubFolder = Join-Path -Path $sRootFolder -ChildPath 'CHUNK'
$aByte4Find = [System.Byte[]](0xFF, 0xFF, 0xFF, 0xFF)
if(Test-Path -Path $sRootFolder -PathType Container) {
if(Test-Path -Path $sEBXSubFolder -PathType Container) {
if(Test-Path -Path $sCHUNKSubFolder -PathType Container) {
Get-ChildItem -Path "$sEBXSubFolder\*.MeshSet" | ForEach-Object -Process {
Write-Host "[$($_.FullName)]" -ForegroundColor Yellow
$aByteContent = [System.IO.File]::ReadAllBytes($_.FullName)
$iCount = 0
for($i = 0; $i -le $aByteContent.Length - $aByte4Find.Length - 1; $i++) {
$bFound = $true
for($j = 0; $j -le $aByte4Find.Length - 1; $j++) {
if($aByteContent[$i + $j] -ne $aByte4Find[$j]) {
$bFound = $false
break
}
}
if($bFound) {
$sFoundFileName = [System.BitConverter]::ToString($aByteContent[$($i - 16) .. $($i - 1)]) -replace '-', ''
Write-Host "`tOffset: $i"
Write-Host "`tFound file name: $sFoundFileName"
if(Test-Path -Path "$sCHUNKSubFolder\$sFoundFileName.chunk" -PathType Leaf) {
Write-Host "`tFile exists!" -ForegroundColor Green
$iCount++
[System.IO.File]::Copy("$sCHUNKSubFolder\$sFoundFileName.chunk", "$($_.DirectoryName)\$($_.BaseName)_$($iCount.ToString("00")).chunk", $true)
} else {
Write-Host "`tFile not exists!" -ForegroundColor Red
}
Write-Host ''
}
}
Write-Host ''
}
} else {
Write-Host "Can't find CHUNK subfolder [$sCHUNKSubFolder]." -ForegroundColor Red
}
} else {
Write-Host "Can't find EBX subfolder [$sEBXSubFolder]." -ForegroundColor Red
}
} else {
Write-Host "Can't find root folder [$sRootFolder]." -ForegroundColor Red
}
https://i.imgur.com/tyLE2dc.png
https://i.imgur.com/zxbxuxx.png
извините, а как пользоваться?
edit: и ещё, я хотел вот так делать: перетаскиваю .MeshSet (это по сути тот же EBX) файл на исполняемый .bat и все нужные .chunk копируются в папку к исходному .MeshSet. такое можно с ним делать?
извините, а как пользоваться? »
Сохранить в файл с расширением .ps1, поменяв пути на свои. Однократно разрешить исполнение локальных неподписанных скриптов PowerShell (about_Execution_Policies | Microsoft Docs (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-6&viewFallbackFrom=powershell-Microsoft.PowerShell.Core), Set-ExecutionPolicy (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy)) командой:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Выполнить сохранённый скрипт командой наподобие:
powershell.exe -file "C:\Мои проекты\0167\Untitled1.ps1"
edit: и ещё, я хотел вот так делать: перетаскиваю .MeshSet (это по сути тот же EBX) файл на исполняемый .bat и все нужные .chunk копируются в папку к исходному .MeshSet. такое можно с ним делать? »
Думаю, можно. Но однократно разрешить «ручками» исполнение локальных неподписанных скриптов PowerShell всё же придётся. И укажите, где искать «все нужные .chunk» по отношению к «исходному .MeshSet» — так же, подняться от файла *.MeshSet на уровень вверх, а затем смотреть в каталог CHUNK? И ещё — не заморитесь перетаскивать по одному такое:
сейчас у меня в папке CHUNK 32000 файлов »
количество *.MeshSet?
*.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
файлы .chunk ищем по указанному адресу »
По какому? Вот, например, я перетащил на скрипт файл «C:\Мои проекты\table\img\bla-bla-bla.MeshSet». Где искать соответствующие файлы *.chunk?
так нужно этот путь в скрипте указать
Tosyk, указать в скрипте? Тогда в чём смысл перетаскивания файла на скрипт? Совершенно не понимаю.
Впрочем, как скажете. Можете задавать путь к файлам *.chunk тупо в скрипте (умолчанием второго аргумента).
param(
[Parameter(Mandatory = $true)][System.String]$SourceFile,
[System.String]$sCHUNKFolder = 'C:\Мои проекты\0167\CHUNK'
)
$aByte4Find = [System.Byte[]](0xFF, 0xFF, 0xFF, 0xFF)
if(Test-Path -Path $SourceFile -PathType Leaf) {
$oSourceFile = [System.IO.FileInfo]$SourceFile
if(Test-Path -Path $sCHUNKFolder -PathType Container) {
Write-Host "[$($oSourceFile.FullName)]" -ForegroundColor Yellow
$aByteContent = [System.IO.File]::ReadAllBytes($oSourceFile.FullName)
$iCount = 0
for($i = 0; $i -le $aByteContent.Length - $aByte4Find.Length - 1; $i++) {
$bFound = $true
for($j = 0; $j -le $aByte4Find.Length - 1; $j++) {
if($aByteContent[$i + $j] -ne $aByte4Find[$j]) {
$bFound = $false
break
}
}
if($bFound) {
$sFoundFileName = [System.BitConverter]::ToString($aByteContent[$($i - 16) .. $($i - 1)]) -replace '-', ''
Write-Host "`tOffset: $i"
Write-Host "`tFound file name: $sFoundFileName"
$sChunkFile = "$sCHUNKFolder\$sFoundFileName.chunk"
if(Test-Path -Path $sChunkFile -PathType Leaf) {
Write-Host "`tFile [$sChunkFile] found!" -ForegroundColor Green
Write-Host "`tCopy to [$($oSourceFile.DirectoryName)] as [$($oSourceFile.BaseName)_$($iCount.ToString("00")).chunk]." -ForegroundColor Green
$iCount++
[System.IO.File]::Copy($sChunkFile, "$($oSourceFile.DirectoryName)\$($oSourceFile.BaseName)_$($iCount.ToString("00")).chunk", $true)
} else {
Write-Host "`tFile [$sChunkFile] not found!" -ForegroundColor Red
}
Write-Host ''
}
}
} else {
Write-Host "Can't find CHUNK folder [$sCHUNKFolder]." -ForegroundColor Red
}
} else {
Write-Host "Can't find source file [$SourceFile]." -ForegroundColor Red
}
Option Explicit
Dim i
Dim sArguments
sArguments = ""
For i = 0 To WScript.Arguments.Count - 1
sArguments = sArguments & " """ & WScript.Arguments.Item(i) & """"
Next
WScript.CreateObject("WScript.Shell").Run """powershell.exe"" -File ""C:\Мои проекты\0167\Sample.ps1"" " & sArguments, 1, False
WScript.Quit 0
Поскольку умолчальным глаголом для .ps1 является отнюдь не «Выполнить с помощью PowerShell» (и что я менять, в общем-то, не советую), то используем промежуточный скрипт WSH, на который и надо перетаскивать файл .MeshSet. Не забудьте поправить все пути в скриптах и сами имена скриптов на свои.
т.е. скрипт RunPowerShell.vbs использует скрипт Sample.ps1 и перетаскивать исходный файл нужно именно на RunPowerShell.vbs?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC