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 - выполнить скрипт с выводом в консоль Примеры в справке.
Последний раз редактировалось: nikzzzz (2020-03-03 00:45), всего редактировалось 3 раз(а)
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() - что скажите?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы