Показать полную графическую версию : Замена текста с помощью VBScript при условии?!
думал об более быстром варианте. »
Код для PowerShell я приводил здесь же ранее. Кроме того, к Вашим услугам AutoIt, AutoHotKey и куча языков высокого уровня.
На PowerShell это может выглядеть так »
Если говорить о powershell, можно, конечно, и с бинарными данными "поработать":
$bytes = [io.file]::readallbytes("client.dll")
[byte[]]$rep = [int[]][char[]]'1401'
[byte[]]$fin = [int[]][char[]]"dota_camera_pitch_max$([char]0x00+[char]0x00+[char]0x00)1134"
$i = -1
$a = -join $fin
do {
$i++
if($bytes[$i] -eq $fin[0]){
$b = -join $bytes[$i..($i+$fin.count-1)]
}
} while ($a -ne $b)
for($n=0;$n -lt $rep.count;$n++){
$bytes[$i+24+$n] = $rep[$n]
}
[io.file]::writeallbytes("client1.dll", $bytes)
но скорость такого "зверского" поиска:
Days : 0
Hours : 0
Minutes : 1
Seconds : 46
Milliseconds : 912
Ticks : 1069122715
TotalDays : 0,00123741054976852
TotalHours : 0,0296978531944444
TotalMinutes : 1,78187119166667
TotalSeconds : 106,9122715
TotalMilliseconds : 106912,2715
в отличие от работы с текстом:
(gc client.dll -raw) -replace '(?<=dota_camera_pitch_max\x00{3})1134','1401'|set-content client2.dll -non
Days : 0
Hours : 0
Minutes : 0
Seconds : 3
Milliseconds : 979
Ticks : 39799266
TotalDays : 4,60639652777778E-05
TotalHours : 0,00110553516666667
TotalMinutes : 0,06633211
TotalSeconds : 3,9799266
TotalMilliseconds : 3979,9266
Разобрался. у меня порядка минуты уходит что бы выполнился этот код. очень долго. »
Если изменяемые значения находятся по перманентному адресу смещения (т.е. адрес изменяемых данных в файле не меняется), то это будет значительно быстрее...
(gc client.dll -raw) -replace '(?<=dota_camera_pitch_max\x00{3})1134','1401'|set-content client.dll -non »
Мне не нравится такой вариант тем, что, насколько я понимаю, файл будет пересоздаваться всякий раз, независимо от того, было ли совпадение шаблона, або нет.
но скорость такого "зверского" поиска:
не впечатлила »
С чем сие связываете?
файл будет пересоздаваться всякий раз, независимо от того, было ли совпадение шаблона, або нет. »
Это да, проверки нет в коде, но это ведь несложно осуществить...
С чем сие связываете? »
Так ведь это даже не поиск шаблона, а последовательный перебор массива... и да, там тоже нет проверки на существование значения и соответственно корректного выхода из цикла тоже нет, просто не стал даже заморачиваться в виду такой "производительности"...
а последовательный перебор массива... »
Хмм… Неужто это даже медленнее работы со строками на WSH?
Неужто это даже медленнее работы со строками на WSH? »
Со строками или с массивом текста?
Да и в любом случае, перебор массива (в данном случае массива символов, не строк) - затратная операция.
Со строками или с массивом текста? »
Со строками. Вот эти вот:
For i = 1 To LenB(arrByteArray)
strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2)
Next
в ConvertByteArray2HexString(arrByteArray) для доступа к содержимому байтового массива. Массив строк же сугубо для минимизации временны́́х затрат при выделении памяти при конкатенации строк — мы заменяем повторённое N раз strContent = strContent & "bla-bla-bla" на одну strContent = Join(arrContent, "") (теоретически там должны быть те же N конкатенаций с теми же всё возрастающими размерами конечной строки с теми же временны́́ми затратами при выделении памяти, но по факту, при стомегабайтных строках — намного, намного ниже).
Кстати, надо бы и с strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2) поэкспериментировать аналогичным образом, может тогда получится увеличить размер буфера чтения (он же размер массива arrByteArray).
Да и в любом случае, перебор массива (в данном случае массива символов, не строк) - затратная операция. »
Да ладно :). Или массив в .Net/PowerShell какой-то не совсем «массив».
Кстати, надо бы и с strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2) поэкспериментировать аналогичным образом, может тогда получится увеличить размер буфера чтения (он же размер массива arrByteArray). »
Поэкспериментировал. Как и подозревал, в данном месте существенной разницы от замены простой конкатенации строк в цикле на присвоение значений массиву строк и его Join()'у по выходу из цикла — не обнаружилось. Оно и понятно — тут-то мы манипулируем в небольших пределах строки — размера буфера (он же размер байтового массива, он же размер порции чтения из файла), это же не конкатенация строки размером в сотню мегабайт, как могло бы быть в основном теле скрипта (вместо использования Join()). В том месте замена конкатенации на Join() имело существенное значение, в этом же месте — не имеет.
Также обнаружилось, что оптимальные значения размера буфера лежат в интервале от 256 до 2048 байт, изменение размера буфера в меньшую или большую сторону приводит к увеличению времени исполнения (весьма забавно, что интуитивно выбранное значение в 512 байт оказалось по факту, пожалуй, наилучшим выбором — для данного конкретного случая, конечно).
Со строками »
Или массив в .Net/PowerShell какой-то не совсем «массив». »
Воот... массив-то, он массив, но его перебор, причем посимвольный, не построчный, так как:
$bytes = [io.file]::readallbytes("client.dll")
- массив байтов, по сути, а я его пытался парсить циклом со счетчиком...
возможно и есть более правильные варианты, но увы знаний у меня по ним нет...
можно, конечно, и с бинарными данными "поработать": »
Не-не-не, это нещщитово — никаких строк, никаких -join'ов. Только массивы, только байты, только хардкор! :lol: И там, кстати, ещё медленнее выйдет, нежели с приведённым вариантом со сравнением первого байта, а затем цельной строки шаблона. Почти в два раза медленнее.
Не-не-не, это нещщитово — никаких строк, никаких -join'ов. »
чойта? кто запретил?
Работаем со всеми доступными методами, главное - результат, а он, увы не впечатляет :)
И там, кстати, ещё медленнее выйдет, нежели с приведённым вариантом со сравнением первого байта, а затем цельной строки шаблона. Почти в два раза медленнее. »
Ну, дык, это и было попыткой ускориться :)
А первоначально, вообще, была стопка вложенных условий... но разница не особо большая получилась :)
чойта? кто запретил?
Работаем со всеми доступными методами, главное - результат, а он, увы не впечатляет »
Ну, это я, понятное дело, шучу так ;): работаем старыми проверенными дедовскими способами — и точка!
А первоначально, вообще, была стопка вложенных условий... »
Ну, я парой обошёлся (и то — мне кажется какой-то кривовастенькой получившаяся реализация).
ByteKiller (http://blackstar.clanbb.ru/viewtopic.php?id=517) или всемизвестный diablo2oo2's Universal Patcher - [dUP] - a freeware patch generator (https://dup-patcher.blogspot.com/) ....уже всёб сделали, пока вы тута переписуетеся http://www.kolobok.us/smiles/icq/smile.gif
x0r, Вы что — тему не читали? Автор не жаждет подобным пользоваться. Я ему зараз предлагал.
Iska, да читал я... подумал, что со второго раза, мож одумаюццо люди, да возьмут норм. способ.
Iska, да, хотелось какого то более удобного способа. С таким же успехом у могу клавиатуру с мышкой запрограммировать они в секунду будут подобную процедуру делать. просто хочется сделать это перед запуском по умолчанию.
x0r, норм способ это когда вы не думаете что нужно что то каждый раз делать. в день по 10 раз пользоваться костылями?
С таким же успехом у могу клавиатуру с мышкой запрограммировать они в секунду будут подобную процедуру делать. »
«С таким же успехом» — не запрограммируете. Никак. Совсем. На воспроизводимость операций вида тык-тык-тык и щёлк-щёлк-щёлк влияет куча внешних факторов, в отличие от нормального программирования.
Iska, при запуске есть консоль которая может работать до запуска самого приложения, соответственно можно было бы автоматизировать.
Hraniti, а причём тут консоль, когда Вы ведёте речь про:
могу клавиатуру с мышкой запрограммировать они в секунду будут… »
Iska, В общем не хочу в полемики в ходить, я считаю что все должно быть автоматизировано. используя старинной софт это уже как усложненно. Нужно что бы все было просто, нажал 1 раз и все запустилось как нужно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.