[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
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 раз(а)

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
nikzzzz, aa
Бесспорно утилита очень хорошая, как и все ваши утилиты! az
Но вот есть нюанс, если ты ничерта не соображаешь в AutoIt т.е где брать скрипты для работы av
Это cAu3.exe /AutoIt3ExecuteScript по-моему может ваша утилита bPatch.exe
Вообщем пока не разобрался, но даже своим невооруженным глазом вижу как однострочные функции AutoIt выполняет отлично
cAu3.exe "IniRead(""%config%"",'config','idir','')"

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
loban_ser
73152если ты ничерта не соображаешь в AutoIt
Так особых знаний и не требуется, особой специфики, как например в PeCmd там нет, достаточно общих знаний в области программирования.
К сожалению, возможности батников ограничены, часто не хватает мелочей, не дающих возможность решить задачу, поэтому и приходится использовать подобные заплатки.
К стати, в Autoit двойные и одиночные кавычки эквивалентны, удобнее использовать одиночные, которые не используются в батниках.
cAu3.exe "IniRead('%config%','config','idir','')"

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
nikzzzz, aa
Спасибо, буду разбираться утилита действительно очень полезная

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
nikzzzz, aa
Утилита очень полезная, но вот есть загвоздочка, если делаю проверку через if в скобках - то неотрабатывает
Не знаю почему av
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
все ок

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
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

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
Ander_73,
Спасибо! az

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
loban_ser
Можно и попроще
If %bootsectout% == GRUBLDR (
  %arch%\cAu3.exe "_FileWrite('..\RenameDir\bootsect.bin',StringReplace(_FileRead('bootsect.bin',512),'I386','%oDir%'),512+2)"
) else (
  %arch%\cAu3.exe "_FileWrite('..\RenameDir\bootsect.bin',StringReplace(_FileRead('grldr_cd.bin',512),'%bootsectin%','%bootsectout%'),512+2)"
)
Не проверял, не уверен на счет путей '..\RenameDir\bootsect.bin' .
Еще вариант.
If %bootsectout% == GRUBLDR (
  %arch%\cAu3.exe "StringReplace($StdIn,'I386','%oDir%')" <bootsect.bin>..\RenameDir\bootsect.bin
) else (
  %arch%\cAu3.exe "StringReplace($StdIn,'%bootsectin%','%bootsectout%')" <grldr_cd.bin>..\RenameDir\bootsect.bin
)

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
73374не уверен на счет путей '..\RenameDir\bootsect.bin'
С путями все в порядке и приведенные вами скрипт (1) отрабатывает как нужно.
Благодарю! az
Я ведь только немного учусь. ah
73374Еще вариант
Если знал бы - не мучался с регулярками ah
ay az
PS: хотябы научился хекс значения получать.
И еще, я так понимаю теперь не нужны скрипты PeplaceBin.au3 и Peplace.au3
можно и так:
cAu3.exe "_FileWrite('путь к файлу\файл',StringReplace(_FileRead('путь к файлу\файл',512),'заменяемый текст','текст замены'),512+2)"
?
путь к файлу\файл - можно в переменных?
Проверил, работает!
есть вопрос: если текст замены будет состоять из нескольких слов и между ними пробел?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
loban_ser
Насколько помню, ReplaceBin.au3 работает с UTF16, Replace.au3 с ANSI.
73381путь к файлу\файл - можно в переменных?
Некорректный вопрос, батник сам разворачивает переменные.
А так, эту опцию не включал, то-есть такой путь '%%SystemRoot%%' не поймет, если нужно получить значение переменной надо использовать EnvGet('SystemRoot') .
73381Усть вопрос: если текст замены будет состоять из нескольких слов и между ними пробел?
Текст может содержать любые символы, пример 'Привет' & @crlf & 'И до свиданья'

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
73386работает с UTF16, Replace.au3 с ANSI
Как можно такую конструкцию:
"_FileWrite('путь к файлу\файл',StringReplace(_FileRead('путь к файлу\файл',512),'заменяемый текст','текст замены'),512+2)"
получить в нужной кодировке?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
loban_ser
Если файл текстовой, то можно.
Кодировка определяется флагом, в примере 512 - Ansi, для других кодировок флаг можно узнать из описания команды Open.
А вот с бинарником такая фишка не пройдет.
С ANSI еще ничего, там один символ - один байт, UTF16 требуют два байта на символ, любое нечетное к-во байт вызовет сбой.
Либо надо переводить текст в бинарный вид, и с ним работать либо использовать другие методы.
Наиболее сложно реализовать регистронезависимое сравнение. (AAAA=aaaa)

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
73389Либо надо переводить текст в бинарный вид, и с ним работать
Это то, что я выше приводил?

[Цитировать]

    nikzzzz
  • 215
  • Стаж: 9 лет 2 месяца
  • Сообщений: 3114
  • Репутация:127

    [+] [-]
73391Это то, что я выше приводил?
Нечто похожее, пример замены в UTF16
"_FileWrite('путь к файлу\файл',StringReplace(_FileRead('путь к файлу\файл',16),StringMid(StringToBinary('заменяемый текст',2),3),StringMid(StringToBinary('текст замены',2),3)),16+2)"
Пример написан в слепую, возможны ошибки.
Замена регистрозависимая (AAA<>aaa)

[Цитировать]

    loban_ser
  • 17796
  • Стаж: 6 лет 1 месяц
  • Сообщений: 578
  • Репутация:24

    [+] [-]
nikzzzz,
Спасибо, замена действитльно происходит, но на примере с Bootmgr не верно корректируется чексумма при обрезании (укарачевании)пути к шрифтам, нежели это делает скрипт ReplaceBin.au3 - там все ок
Блин.... опять я что-то не так первый раз сделал, теперь все нормально, ничего не понимаю av
Добавлено через 8 минут 16 секунд:
73393Замена регистрозависимая
В таком случае думаю нужно использовать за раннее функцию StringUpper() - что скажите?

Страница 1 из 2


Показать сообщения:    

Текущее время: 28-Мар 17:33

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы