Drovosek01 / ReplaceHexPatcher

Multitool for Windows for native find + replace bytes in hex format and made other system modifications from parsed template
8 stars 0 forks source link

Безумная логика скрипта #1

Open MVKozlov opened 3 months ago

MVKozlov commented 3 months ago

Мне кажется скрипт должен быть на порядок проще устроен скелет примерно такой

$patterns = extract-patterns
$output_file = if-need-backup_write_to_other_file-or-original_file
if (test-writable $output_file) {
  do_replacement or fail(if_already_admin)
}
else {
  runwithAdmin do_replacement
}

Ну и использовать мощь powershell

паттерны, например, можно возвращать через PSCustomObject, а не коллекционировать массивы (да ещё и через +=)

function Separate-Patterns {
    param (
        [Parameter(Mandatory)]
        [string[]]$patterns
    )

    # Separate pattern-string on search and replace strings
    foreach ($pattern in $patterns) {
        # Clean and split string with search and replace hex patterns
        [string[]]$temp = $pattern.Clone().Replace(" ","").Replace("\x","").Replace("\","/").Replace("|","/").ToUpper().Split("/")

        if ($temp.Count -gt 2) {
            throw "Wrong pattern $pattern and $temp"
        }

        [byte[]]$searchHexPattern = (Convert-HexStringToByteArray -hexString $temp[0])
        [byte[]]$replaceHexPattern = (Convert-HexStringToByteArray -hexString $temp[1])

        [PSCustomObject]@{
            Search = $searchHexPattern
            Replace = $replaceHexPattern
        }
    }
}

тут ещё надо убедиться, что длины search и replace одинаковы

При этом, конечно, никаких "$variable", потому что это то же самое что $variable, а глаза режет

Drovosek01 commented 3 months ago

Спасибо за ревью)

При этом, конечно, никаких "$variable", потому что это то же самое что $variable, а глаза режет

А если в переменной хранится путь к файлу/папке и в пути есть пробелы - тогда без оборачивания переменной в кавычки переменная "развернется" и на ее месте будет текста разделенный пробелами... тогда будет ошибка.

Или я не правильно что-то понимаю?

MVKozlov commented 3 months ago

неправильно :) переменные содержат строки, которые именно в таком виде и передаются командам. а уж команды там что-то делают с пробелами или не делают.

PS C:\> test-path "C:\Program Files (x86)"
True
PS C:\> $a = "C:\Program Files (x86)" ; test-path $a
True

Двойные кавычки нужны только для разворачивания самих переменных.

$a = 'aaa'; 'это $a'; "а это $a"