|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла |
|
|
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла
|
Старожил Сообщения: 286 |
Профиль | Отправить PM | Цитировать
Добрый.
Сейчас делаю так: Есть файл, скажем B2DD.tmp. около 20МБ. Открываю его в hex редакторе, нахожу нужное а именно (35 32 88 65 59 18 01). Важно! сама искомая комбинация выглядит так: 08 3А 35 32 88 65 59 18 01, но почему то по полному запросу не находит. Меняю полную найденную строку на 08 8A XX XX XX XX XX XX XX. Сохраняю файл. Можно ли это проделать в powershell? без использования hex-редактора. Или с помощью любой другой консольной утилиты. (если можно с примерами) Спасибо. |
|
Отправлено: 15:36, 02-08-2021 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата 9119:
Цитата 9119:
Цитата 9119:
Цитата 9119:
|
||||
Отправлено: 15:56, 02-08-2021 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 286
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
Отправлено: 16:23, 02-08-2021 | #3 |
Ветеран Сообщения: 1274
|
Профиль | Отправить PM | Цитировать у меня вышло пока так:
PowerShell но выполнение на приведенном файле ой как не быстро. |
Отправлено: 02:44, 03-08-2021 | #4 |
Старожил Сообщения: 286
|
Профиль | Отправить PM | Цитировать Цитата alpap:
вижу часть замены 08 3a на 08 8A, а где остальная замена 35 32 88 65 59 18 на нужное мне XX XX XX XX XX XX ? как-то так?: $my_data = 'XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX' $stroke = '0' $cont = Switch -Regex -File $tmp { " 08 3a $slineHex" {$_ -Replace ' 08 3a', ' 08 8A' -Replace ' $slineHex', ' ($my_data)[$stroke]'} Default {$_} } Есть ли более быстрая возможность замены?(как это делают hex редакторы.. скорость в данном случае для меня имеет значение). Возможно сторонние консольные утилиты . p.s.s как привел выше... комбинаций для замены будет несколько (скажем 20). и после выполнения, скрипт должен становится на паузу, а переменная $stroke должна увеличиваться после каждого выполнения на +1 (тем самым получая следующую строку $my_data в следующем цикле). |
||
Последний раз редактировалось 9119, 03-08-2021 в 10:34. Отправлено: 10:15, 03-08-2021 | #5 |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать Цитата 9119:
$file = 'F0D7.tmp' $fout = 'F0D7_1.tmp' [byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01 [byte]$rep = 0x8A $bytes = [io.file]::readallbytes($file) $i = -1 $a = -join $fin do { $i = [byte[]]::indexof($bytes,$fin[0],($i+1)) [byte[]]$tmp = @() for ($k = $i; $k -lt ($i+$fin.count);$k++){ $tmp += $bytes[$k] } $b = -join $tmp } while ($a -ne $b) $bytes[($i+1)] = $rep [io.file]::writeallbytes($fout, $bytes) Цитата 9119:
|
||
------- Отправлено: 10:29, 03-08-2021 | #6 |
Старожил Сообщения: 286
|
Профиль | Отправить PM | Цитировать $file = 'F0D7.tmp' $fout = 'F0D7_1.tmp' $list = '0x08 0x8a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0x21 0x08 0x8a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0x22' $number = '0' [byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01 [byte]$rep = ($list)[$number] $bytes = [io.file]::readallbytes($file) $i = -1 $a = -join $fin do { $i = [byte[]]::indexof($bytes,$fin[0],($i+1)) [byte[]]$tmp = @() for ($k = $i; $k -lt ($i+$fin.count);$k++){ $tmp += $bytes[$k] } $b = -join $tmp } while ($a -ne $b) $bytes[($i+1)] = $rep [io.file]::writeallbytes($fout, $bytes) Чтобы выполнялся Пока ($list)[$number] не равно null; когда переменная пустая (т.е строки закончились) - выдать уведомление что строк нет и стать на паузу. Спасибо. |
Отправлено: 10:44, 03-08-2021 | #7 |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать Цитата 9119:
$file = 'F0D7.tmp' $fout = 'F0D7_1.tmp' [byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01 [byte[]]$rep = 0x8A,0x34,0x31,0x87,0x64,0x58,0x17,0x00 $bytes = [io.file]::readallbytes($file) $i = -1 $a = -join $fin do { $i = [byte[]]::indexof($bytes,$fin[0],($i+1)) [byte[]]$tmp = @() for ($k = $i; $k -lt ($i+$fin.count);$k++){ $tmp += $bytes[$k] } $b = -join $tmp } while ($a -ne $b) for ($j,$n=0,$($i+1);$j -lt $rep.count;$n++,$j++){ $bytes[$n] = $rep[$j] } [io.file]::writeallbytes($fout, $bytes) Либо, чтобы была возможность для простой замены нескольких строк по шаблону, то уравнять шаблон поиска и замены по количеству символов, и подавать эти шаблоны извне: param( $file = '.\F0D7.tmp', $fout = '.\F0D7_1.tmp', [byte[]]$fin = (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01), [byte[]]$rep = (0x08,0x8A,0x34,0x31,0x87,0x64,0x58,0x17,0x00) ) $bytes = [io.file]::readallbytes($file) $i = -1 $a = -join $fin do { $i = [byte[]]::indexof($bytes,$fin[0],($i+1)) [byte[]]$tmp = @() for ($k = $i; $k -lt ($i+$fin.count);$k++){ $tmp += $bytes[$k] } $b = -join $tmp } while ($a -ne $b) for ($j,$n=0,$i;$j -lt $rep.count;$n++,$j++){ $bytes[$n] = $rep[$j] } [io.file]::writeallbytes($fout, $bytes) |
|
------- Последний раз редактировалось YuS_2, 03-08-2021 в 11:28. Причина: Дополнение Отправлено: 11:03, 03-08-2021 | #8 |
Старожил Сообщения: 286
|
Профиль | Отправить PM | Цитировать YuS_2,
не могу получить желаемое. Я этого не уточнял в шапке. Что значение не одно. Делаю так: *в файле 10 строк. кроме как ($list)["номер строки"] - не знаю как еще получить нужную строку. Но если подставляю полученное в [byte[]]$rep - получаю что не может перекодировать полученное в system byte * строки в txt подогнаны под формат 0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX как сделать, чтобы в [byte[]]$rep в вашем коде попадала сначала первая строка, потом вторую и т.д? |
Отправлено: 11:23, 03-08-2021 | #9 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Чуть более лаконичный вариант коллеги alpap
$file = 'D:\temp\F0D7.tmp' $tmp = 'D:\temp\tmp.tmp' $pattern = '08 3a 35 32 88 65 59 18' $replacement = '08 8a 35 32 88 65 59 18' certutil -f -encodeHex "$file" "$tmp" > $null (gc "$tmp") -replace "$pattern","$replacement" |set-content "$tmp" certutil -f -decodeHex "$tmp" "$file" > $null Цитата 9119:
|
|
------- Отправлено: 11:23, 03-08-2021 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBA - Редактировать hex значения в файле | blackeangel | Программирование и базы данных | 14 | 21-05-2019 16:33 | |
CMD/BAT - [решено] замена значения в xml-файле | firstarey | Скриптовые языки администрирования Windows | 20 | 13-11-2017 11:24 | |
VBS/WSH/JS - поиск значения в текстовом файле и выбор данной строки | God-of-Chaos | Скриптовые языки администрирования Windows | 10 | 07-06-2015 19:06 | |
работа с файлами в HEX формате, поиск и замена по 16ричному адресу значения в файле. | andr_mozg | AutoIt | 3 | 10-03-2012 10:20 | |
CMD/BAT - [решено] Поиск файла, значения в файле и создания для них переменных | popoves | Скриптовые языки администрирования Windows | 4 | 29-02-2012 20:59 |
|