cAu3.exe - Консольная утилита, позволяющая выполнить одну строку скрипта, написанного на Autoit с полной передачей данных в .bat файл. cAu3.exe так-же может использоваться как консольная версия Autoit (/AutoIt3ExecuteScript) для выполнения .au3 скрипта с выводом в консоль Syntax: cAu3.exe [/?] Au3String [/ds:'Delims'][/da:'Delims'] cAu3.exe /AutoIt3ExecuteScript Script.au3 /ds - заменяет при выводе переводы строк на указанную строку или символ /da - разделитель для значений массивов /i - начальный индекс массива, по умолчанию 0 /AutoIt3ExecuteScript - выполнить скрипт с выводом в консоль Примеры в справке.
Last edited by nikzzzz on 2020-03-03 00:45; edited 3 times in total
nikzzzz, Бесспорно утилита очень хорошая, как и все ваши утилиты! Но вот есть нюанс, если ты ничерта не соображаешь в AutoIt т.е где брать скрипты для работы Это cAu3.exe /AutoIt3ExecuteScript по-моему может ваша утилита bPatch.exe Вообщем пока не разобрался, но даже своим невооруженным глазом вижу как однострочные функции AutoIt выполняет отлично
Так особых знаний и не требуется, особой специфики, как например в PeCmd там нет, достаточно общих знаний в области программирования. К сожалению, возможности батников ограничены, часто не хватает мелочей, не дающих возможность решить задачу, поэтому и приходится использовать подобные заплатки. К стати, в Autoit двойные и одиночные кавычки эквивалентны, удобнее использовать одиночные, которые не используются в батниках.
nikzzzz, Утилита очень полезная, но вот есть загвоздочка, если делаю проверку через if в скобках - то неотрабатывает Не знаю почему
If %bootsectout% == GRUBLDR ( gsar.exe "-sI386" "-r%oDir%" bootsect.bin "..\RenameDir\bootsect.bin" >nul ) else ( for /f "delims=" %%# in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectin%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do set "InName=:x%%#" for /f "delims=" %%$ in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectout%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do set "OutName=:x%%$" gsar.exe "-s%InName%" "-r%OutName%" grldr_cd.bin "..\RenameDir\bootsect.bin" >nul )
делаю так:
If %bootsectout% == GRUBLDR ( gsar.exe "-sI386" "-r%oDir%" bootsect.bin "..\RenameDir\bootsect.bin" >nul ) else ( CALL :BOOTSECT ) :BOOTSECT for /f "delims=" %%# in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectin%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do set "InName=:x%%#" for /f "delims=" %%$ in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectout%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do set "OutName=:x%%$" gsar.exe "-s%InName%" "-r%OutName%" grldr_cd.bin "..\RenameDir\bootsect.bin" >nul goto :eof
loban_ser, внутри скобок переменные неизменны. Можно использовать EnableDelayedExpansion.
setlocal EnableDelayedExpansion If %bootsectout% == GRUBLDR ( gsar.exe "-sI386" "-r%oDir%" bootsect.bin "..\RenameDir\bootsect.bin" >nul ) else ( for /f "delims=" %%# in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectin%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do set "InName=:x%%#" for /f "delims=" %%$ in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectout%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do set "OutName=:x%%$" gsar.exe "-s!InName!" "-r!OutName!" grldr_cd.bin "..\RenameDir\bootsect.bin" >nul ) endlocal
Добавлено через 4 минуты 7 секунд: ... или совсем по чумному
If %bootsectout% == GRUBLDR ( gsar.exe "-sI386" "-r%oDir%" bootsect.bin "..\RenameDir\bootsect.bin" >nul ) else ^ for /f "delims=" %%# in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectin%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do ^ for /f "delims=" %%$ in ('%arch%\cAu3.exe "StringRegExpReplace(StringReplace(StringToBinary('%bootsectout%','4'),'0x',''),'(\A\d{1,2}(?=(\d{2})+\z)|\w{2}(?=\w)|\d{2}(?=\d))','\1:x')"') do ^ gsar.exe "-s:x%%#" "-r:x%%$" grldr_cd.bin "..\RenameDir\bootsect.bin" >nul
73374не уверен на счет путей '..\RenameDir\bootsect.bin'
С путями все в порядке и приведенные вами скрипт (1) отрабатывает как нужно. Благодарю! Я ведь только немного учусь.
73374Еще вариант
Если знал бы - не мучался с регулярками PS: хотябы научился хекс значения получать. И еще, я так понимаю теперь не нужны скрипты PeplaceBin.au3 и Peplace.au3 можно и так:
cAu3.exe "_FileWrite('путь к файлу\файл',StringReplace(_FileRead('путь к файлу\файл',512),'заменяемый текст','текст замены'),512+2)"
? путь к файлу\файл - можно в переменных? Проверил, работает! есть вопрос: если текст замены будет состоять из нескольких слов и между ними пробел?
loban_ser Насколько помню, ReplaceBin.au3 работает с UTF16, Replace.au3 с ANSI.
73381путь к файлу\файл - можно в переменных?
Некорректный вопрос, батник сам разворачивает переменные. А так, эту опцию не включал, то-есть такой путь '%%SystemRoot%%' не поймет, если нужно получить значение переменной надо использовать EnvGet('SystemRoot') .
73381Усть вопрос: если текст замены будет состоять из нескольких слов и между ними пробел?
Текст может содержать любые символы, пример 'Привет' & @crlf & 'И до свиданья'
loban_ser Если файл текстовой, то можно. Кодировка определяется флагом, в примере 512 - Ansi, для других кодировок флаг можно узнать из описания команды Open. А вот с бинарником такая фишка не пройдет. С ANSI еще ничего, там один символ - один байт, UTF16 требуют два байта на символ, любое нечетное к-во байт вызовет сбой. Либо надо переводить текст в бинарный вид, и с ним работать либо использовать другие методы. Наиболее сложно реализовать регистронезависимое сравнение. (AAAA=aaaa)
"_FileWrite('путь к файлу\файл',StringReplace(_FileRead('путь к файлу\файл',16),StringMid(StringToBinary('заменяемый текст',2),3),StringMid(StringToBinary('текст замены',2),3)),16+2)"
Пример написан в слепую, возможны ошибки. Замена регистрозависимая (AAA<>aaa)
nikzzzz, Спасибо, замена действитльно происходит, но на примере с Bootmgr не верно корректируется чексумма при обрезании (укарачевании)пути к шрифтам, нежели это делает скрипт ReplaceBin.au3 - там все ок Блин.... опять я что-то не так первый раз сделал, теперь все нормально, ничего не понимаю Добавлено через 8 минут 16 секунд:
73393Замена регистрозависимая
В таком случае думаю нужно использовать за раннее функцию StringUpper() - что скажите?
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum