Показать полную графическую версию : копирование файлов по hash-имени из HEX исходного файла
что-то не может найти ни одного файла.
все пути прописал правильно, проверил. все чанки у меня в одной папке, до которой я указываю путь. беру файл: 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?
1. можно ли сделать поиск чанков рекурсивным? - если у меня в папке CHUNK будет структура сложнее одной папки »
Можно. И сразу ответьте, что делать, если там окажется несколько файлов с подходящим именем (в разных каталогах)?
2. можно ли сделать чтобы скрипт не заменял скопированный чанк если он уже есть в папке а именовал его как-то с суфиксом? »
Можно. Как именно именовал «как-то с суфиксом»?
3. можно ли добавить возможность копирования чанков с их оригиналными именами рядом с исходным файлом в папку CHUNKS? »
Можно.
4. можно ли как-то исбежать шаг разрешения выполнения подобных скриптов на компе? »
А в чём проблема-то однократно разрешить исполнение локальных неподписанных скриптов?
p.s.: можно ли как-то транслитировать этот код в auto-it и зашить в exe? »
Полагаю, что можно.
что делать, если там окажется несколько файлов с подходящим именем (в разных каталогах)? »Можно. Как именно именовал «как-то с суфиксом»? »
максимальная глубина, на которую я расчитываю это в папке CHUNKS будут лежать ещё две папки: CHUNKS0 и CHUNKS1. поэтому можно к файлам применять суфикс ch0 и ch1 соответственно
А в чём проблема-то однократно разрешить исполнение локальных неподписанных скриптов? »однократно за сессию или за всю жизнь винды? и может ли это привести к печальным последствиям безопасности?
максимальная глубина, на которую я расчитываю это в папке CHUNKS будут лежать ещё две папки: CHUNKS0 и CHUNKS1. поэтому можно к файлам применять суфикс ch0 и ch1 соответственно »
Ответьте, пожалуйста, на те вопросы, которые я задавал. Ни на какие другие, не заданные мною вопросы, отвечать не нужно.
однократно за сессию или за всю жизнь винды? и может ли это привести к печальным последствиям безопасности? »
Вот здесь (http://forum.oszone.net/post-2819631.html#post2819631) я приводил две ссылки. Прочтите их. Или — прочтите ещё раз.
что делать, если там окажется несколько файлов с подходящим именем (в разных каталогах)? »копировать оба в исходный каталог
Как именно именовал «как-то с суфиксом»? »в качестве индекса использовать имя исходной папки
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
вроде бы начало работать, но через 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(
[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
Как теперь?
всё классно работает!
можете ли добавить копирование эти же чанков с их оригинальными именами в папку CHUNKS рядом с исходным файлом? для консистентности
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)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC