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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   копирование файлов по hash-имени из HEX исходного файла (http://forum.oszone.net/showthread.php?t=335495)

Tosyk 26-06-2018 21:24 2819592

копирование файлов по hash-имени из HEX исходного файла
 
всем привет,

1. имеется папка с кучей файлов. у файлов вместо имени hash-абракадабра типа: 000ec4d858ebbaa80621fc19a608599f.chunk или aa8d9cd800e0c17bc5b03d488ab17572.chunk
2. имеется набор файлов с расширением EBX (и нормальными именами), в хексе которых эти hash-имена.

задача вот такая вот: кидаем EBX на BAT файл и соответствующие файлы .chunk копируются к исходному EBX и, было бы круто, эти скопированные .chunk файлы переименовывать в имя EBX с числовым индексом.

подскажите как такое реализовать.

p.s.: обнаружил, что после каждого hash-имени внутри EBX идёт hex-значение: FFFFFFFF

Iska 26-06-2018 22:03 2819598

Tosyk, как понять, что есть:
Цитата:

Цитата Tosyk
в хексе которых эти hash-имена. »

Цитата:

Цитата Tosyk
копируются к исходному EBX »

Цитата:

Цитата Tosyk
переименовывать в имя EBX с числовым индексом »

? Где образцы тех и других файлов, упакованных в архив? Где примеры того, что есть, и что надо получить?

Tosyk 26-06-2018 22:21 2819600

прошу прощения, у меня голова садовая
вот примеры:
https://drive.google.com/file/d/16r6...ew?usp=sharing

возможно, когда вы посмотрите на них у вас не останется вопросов

Iska 26-06-2018 22:33 2819601

Цитата:

Цитата Tosyk
возможно, когда вы посмотрите на них у вас не останется вопросов »

Лично мне понятней не стало. Вы не ответили на первый и последний вопросы.

Tosyk 26-06-2018 22:46 2819602

если вы откроете любой из двух файлов .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


Iska 26-06-2018 23:10 2819607

Цитата:

Цитата Tosyk
нужно просканировать .MeshSet выявить список всех таких имён »

Ориентируемся только на то, что Вы сказали:
Цитата:

Цитата Tosyk
перед каждым значением FFFFFFFF будет 32-ух значное имя файла »

?

Tosyk 26-06-2018 23:14 2819608

вообще это я сам придумал. если есть какая-то возможность понять где в этом файле (в данном случае .MeshSet) будут эти 32-ух значные имена НЕ ориентируясь на FFFFFFFF то это было бы просто отлично

edit: сейчас у меня в папке CHUNK 32000 файлов

Iska 26-06-2018 23:22 2819612

Tosyk, хорошо бы. Но для этого нужно знать или иметь описание внутреннего формата этих файлов. Что это вообще такое?

Tosyk 26-06-2018 23:41 2819614

Вложений: 1
ebx - это общий игровой формат движка frostbite. довольно разносторонний. там может всё что угодно содержаться, но что меня интересует так это только линки на эти 32-ух значные имена.
вот что то похожее на описание: https://pastebin.com/rGpBFwAV
в аттаче я прикрепил подобный файлу .MeshSet файл для линка к текстуре. из него можно узнать имя 4D42EF837BFB4F9CBD9E664F7959E7A3 и это ещё один файл из папки CHUNK только это уже будет текстура.

Iska 27-06-2018 00:58 2819627

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
}


У меня вышли такие результаты




Tosyk 27-06-2018 01:43 2819630

извините, а как пользоваться?

edit: и ещё, я хотел вот так делать: перетаскиваю .MeshSet (это по сути тот же EBX) файл на исполняемый .bat и все нужные .chunk копируются в папку к исходному .MeshSet. такое можно с ним делать?

Iska 27-06-2018 02:31 2819631

Цитата:

Цитата Tosyk
извините, а как пользоваться? »

Сохранить в файл с расширением .ps1, поменяв пути на свои. Однократно разрешить исполнение локальных неподписанных скриптов PowerShell (about_Execution_Policies | Microsoft Docs, Set-ExecutionPolicy) командой:
Код:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Выполнить сохранённый скрипт командой наподобие:
Код:

powershell.exe -file "C:\Мои проекты\0167\Untitled1.ps1"
Цитата:

Цитата Tosyk
edit: и ещё, я хотел вот так делать: перетаскиваю .MeshSet (это по сути тот же EBX) файл на исполняемый .bat и все нужные .chunk копируются в папку к исходному .MeshSet. такое можно с ним делать? »

Думаю, можно. Но однократно разрешить «ручками» исполнение локальных неподписанных скриптов PowerShell всё же придётся. И укажите, где искать «все нужные .chunk» по отношению к «исходному .MeshSet» — так же, подняться от файла *.MeshSet на уровень вверх, а затем смотреть в каталог CHUNK? И ещё — не заморитесь перетаскивать по одному такое:
Цитата:

Цитата Tosyk
сейчас у меня в папке CHUNK 32000 файлов »

количество *.MeshSet?

Tosyk 27-06-2018 09:58 2819649

*.MeshSet - это только один из форматов EBX файлов. у меня две папки CHUNKS и BUNDLES. про CHUNKS я уже рассказал, а в папке BUNDLES довольно конкретная и сложная структура файлов с правильными именами и своими расширениями. 60% всех файлов в BUNDLES это .ebx файлы, остальные это .MeshSet/.dxTexture/.iTexture и т.д. в большинстве своём это просто скрипты и линки на файлы из папки CHUNKS. Иногда попадаются другие типы .ebx файлов, полноценные, имеющие, например, внутри 3д геометрию, другие настройки физики.

мне не нужны все эти файлы, моя цель сейчас это выбрать нужные мне .MeshSet и перетягиванием на исполняемый скрипт получить копии файлов из папки CHUNKS. Если всё будет хорошо работать, возможно можно будет попробовать коллекционировать таким образом .chunk файлы для других типов как то .dxTexture/.iTexture и т.д.

Iska 27-06-2018 19:41 2819723

Tosyk, ещё раз: где искать соответствующие файлы *.chunk по отношению к файлу .MeshSet? Вот мы перетянули на скрипт файл .MeshSet, получили в скрипте полный путь к нему. Где искать файлы *.chunk относительно пути этого файла .MeshSet?

Tosyk 27-06-2018 22:07 2819749

файлы .chunk ищем по указанному адресу, может быть любой. безотносительно файлов .MeshSet

Iska 27-06-2018 22:44 2819758

Цитата:

Цитата Tosyk
файлы .chunk ищем по указанному адресу »

По какому? Вот, например, я перетащил на скрипт файл «C:\Мои проекты\table\img\bla-bla-bla.MeshSet». Где искать соответствующие файлы *.chunk?

Tosyk 27-06-2018 23:53 2819766

так нужно этот путь в скрипте указать

Iska 28-06-2018 01:25 2819769

Tosyk, указать в скрипте? Тогда в чём смысл перетаскивания файла на скрипт? Совершенно не понимаю.

Впрочем, как скажете. Можете задавать путь к файлам *.chunk тупо в скрипте (умолчанием второго аргумента).
C:\Мои проекты\0167\Sample.ps1
Код:

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
}


C:\Мои проекты\0167\RunPowerShell.vbs
Код:

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. Не забудьте поправить все пути в скриптах и сами имена скриптов на свои.

Tosyk 28-06-2018 12:58 2819837

т.е. скрипт RunPowerShell.vbs использует скрипт Sample.ps1 и перетаскивать исходный файл нужно именно на RunPowerShell.vbs?

Iska 28-06-2018 18:33 2819881

Tosyk, да.

Tosyk 28-06-2018 21:26 2819906

что-то не может найти ни одного файла.
все пути прописал правильно, проверил. все чанки у меня в одной папке, до которой я указываю путь. беру файл: D:\_r\fb\_ex_test\bundles\res\characters\heads\sp_brady\sp_brady_head_mesh 00160000000000003801000070009400.MeshSet и кидаю его на ps_chunks0_search.vbs. в итоге мигает чёрное окно с красным текстом. правильный чанк по пути имеется.

Iska 29-06-2018 00:44 2819937

Tosyk, ну, если у меня работает, а у Вас нет, значит, явно что-то не так.

Покажите Ваш код PowerShell с исправленными путями. Покажите Ваш код ps_chunks0_search.vbs. Покажите содержимое каталога с «все чанки у меня в одной папке, до которой я указываю путь». Упакуйте в архив Ваш sp_brady_head_mesh 00160000000000003801000070009400.MeshSet и приложите к сообщению. Покажите скриншот с:
Цитата:

Цитата Tosyk
в итоге мигает чёрное окно с красным текстом. »


Tosyk 29-06-2018 09:14 2819962

я бы сделал скриншот, но как? окно ведь мигает. можно как-то запаузить его?

Iska 29-06-2018 10:57 2819987

Добавьте в самый конец Sample.ps1:
Код:

Read-Host | Out-Null

Tosyk 29-06-2018 21:40 2820051

в окошке было написано, что у меня компьютере не разрешено выполнение таких скриптов. я дал разрешение и всё заработало.
несколько вопросов:

1. можно ли сделать поиск чанков рекурсивным? - если у меня в папке CHUNK будет структура сложнее одной папки
2. можно ли сделать чтобы скрипт не заменял скопированный чанк если он уже есть в папке а именовал его как-то с суфиксом?
3. можно ли добавить возможность копирования чанков с их оригиналными именами рядом с исходным файлом в папку CHUNKS?
4. можно ли как-то исбежать шаг разрешения выполнения подобных скриптов на компе?


вообще это очень крутая штука, работает как надо, спасибо вам огромное! много лет не решался написать по этому поводу сюда

p.s.: можно ли как-то транслитировать этот код в auto-it и зашить в exe?

Iska 29-06-2018 23:51 2820060

Цитата:

Цитата Tosyk
1. можно ли сделать поиск чанков рекурсивным? - если у меня в папке CHUNK будет структура сложнее одной папки »

Можно. И сразу ответьте, что делать, если там окажется несколько файлов с подходящим именем (в разных каталогах)?

Цитата:

Цитата Tosyk
2. можно ли сделать чтобы скрипт не заменял скопированный чанк если он уже есть в папке а именовал его как-то с суфиксом? »

Можно. Как именно именовал «как-то с суфиксом»?

Цитата:

Цитата Tosyk
3. можно ли добавить возможность копирования чанков с их оригиналными именами рядом с исходным файлом в папку CHUNKS? »

Можно.

Цитата:

Цитата Tosyk
4. можно ли как-то исбежать шаг разрешения выполнения подобных скриптов на компе? »

А в чём проблема-то однократно разрешить исполнение локальных неподписанных скриптов?

Цитата:

Цитата Tosyk
p.s.: можно ли как-то транслитировать этот код в auto-it и зашить в exe? »

Полагаю, что можно.

Tosyk 30-06-2018 10:16 2820083

Цитата:

Цитата Iska
что делать, если там окажется несколько файлов с подходящим именем (в разных каталогах)? »

Цитата:

Цитата Iska
Можно. Как именно именовал «как-то с суфиксом»? »

максимальная глубина, на которую я расчитываю это в папке CHUNKS будут лежать ещё две папки: CHUNKS0 и CHUNKS1. поэтому можно к файлам применять суфикс ch0 и ch1 соответственно
Цитата:

Цитата Iska
А в чём проблема-то однократно разрешить исполнение локальных неподписанных скриптов? »

однократно за сессию или за всю жизнь винды? и может ли это привести к печальным последствиям безопасности?

Iska 30-06-2018 12:20 2820092

Цитата:

Цитата Tosyk
максимальная глубина, на которую я расчитываю это в папке CHUNKS будут лежать ещё две папки: CHUNKS0 и CHUNKS1. поэтому можно к файлам применять суфикс ch0 и ch1 соответственно »

Ответьте, пожалуйста, на те вопросы, которые я задавал. Ни на какие другие, не заданные мною вопросы, отвечать не нужно.

Цитата:

Цитата Tosyk
однократно за сессию или за всю жизнь винды? и может ли это привести к печальным последствиям безопасности? »

Вот здесь я приводил две ссылки. Прочтите их. Или — прочтите ещё раз.

Tosyk 30-06-2018 12:46 2820094

Цитата:

Цитата Iska
что делать, если там окажется несколько файлов с подходящим именем (в разных каталогах)? »

копировать оба в исходный каталог
Цитата:

Цитата Iska
Как именно именовал «как-то с суфиксом»? »

в качестве индекса использовать имя исходной папки

Iska 01-07-2018 07:45 2820159

Tosyk, чем больше я пытаюсь осмыслить все озвученные Вами хотелки, тем меньше они мне нравятся. Если реализовать всё задуманное — получится полная каша.

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

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"

                $cChunkFiles = @(Get-ChildItem -Path "$sCHUNKFolder\$sFoundFileName.chunk" -File -Recurse)
               
                if($cChunkFiles.Count) {
                    $iCount++
                    $jCount = 0

                    $cChunkFiles | ForEach-Object -Process {
                        $jCount++
                        $sDestFileName = "$($oSourceFile.BaseName)_$($iCount.ToString("00"))_$($jCount.ToString("00")).chunk"

                        Write-Host "`tFile    [$($_.FullName)] found!" -ForegroundColor Green
                        Write-Host "`tCopy to [$($oSourceFile.DirectoryName)] as [$sDestFileName]." -ForegroundColor Green
                        [System.IO.File]::Copy($sChunkFile, "$($oSourceFile.DirectoryName)\$sDestFileName", $true)
                    }
                } else {
                    Write-Host "`tFile(s) [$sFoundFileName.chunk] not found in folder [$sCHUNKFolder]!" -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
}

Write-Host 'Press Enter to close...' -NoNewline; Read-Host | Out-Null


Tosyk 01-07-2018 11:38 2820170

вроде бы начало работать, но через 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...
ничего не скопировало

Iska 02-07-2018 12:37 2820277

Поменял одну неправильную строку и убрал одну лишнюю:
Скрытый текст
Код:

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"
               
                $cChunkFiles = @(Get-ChildItem -Path "$sCHUNKFolder\$sFoundFileName.chunk" -File -Recurse)
               
                if($cChunkFiles.Count) {
                    $iCount++
                    $jCount = 0

                    $cChunkFiles | ForEach-Object -Process {
                        $jCount++
                        $sDestFileName = "$($oSourceFile.BaseName)_$($iCount.ToString("00"))_$($jCount.ToString("00")).chunk"

                        Write-Host "`tFile    [$($_.FullName)] found!" -ForegroundColor Green
                        Write-Host "`tCopy to [$($oSourceFile.DirectoryName)] as [$sDestFileName]." -ForegroundColor Green
                        [System.IO.File]::Copy($_.FullName, "$($oSourceFile.DirectoryName)\$sDestFileName", $true)
                    }
                } else {
                    Write-Host "`tFile(s) [$sFoundFileName.chunk] not found in folder [$sCHUNKFolder]!" -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
}

Write-Host 'Press Enter to close...' -NoNewline; Read-Host | Out-Null


Как теперь?

Tosyk 02-07-2018 23:31 2820359

всё классно работает!

можете ли добавить копирование эти же чанков с их оригинальными именами в папку CHUNKS рядом с исходным файлом? для консистентности

Iska 06-07-2018 15:37 2820858

Tosyk, не мытьём, так катаньем, да ;)?

Добавьте:
Код:

if(-not [System.IO.Directory]::Exists("$($oSourceFile.DirectoryName)\CHUNKS")) {
                            [System.IO.Directory]::CreateDirectory("$($oSourceFile.DirectoryName)\CHUNKS")
                        }
                        [System.IO.File]::Copy($_.FullName, "$($oSourceFile.DirectoryName)\CHUNKS\$($_.Name)", $true)

после:
Код:

                        [System.IO.File]::Copy($_.FullName, "$($oSourceFile.DirectoryName)\$sDestFileName", $true)


Время: 13:30.

Время: 13:30.
© OSzone.net 2001-