Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Необходимо из файла считать строку и участи строки присвоить переменным (http://forum.oszone.net/showthread.php?t=350089)

boomdeamon 18-11-2021 22:38 2972462

Необходимо из файла считать строку и участи строки присвоить переменным
 
Вложений: 2
Есть текстовый файл в котором есть строка
remote result (not to be trusted): [ 82074624499369902458868130586453554849 65228258370552867395165752861763116226784530337709001549878075 100000000000 256 ]
необходимо для каждое числа, которое заключено в [ ] присвоить значение переменной, числа могут быть разной длины каждое
a=82074624499369902458868130586453554849
b=65228258370552867395165752861763116226784530337709001549878075
c=100000000000
d=256

YuS_2 19-11-2021 09:29 2972487

Цитата:

Цитата boomdeamon
необходимо для каждое числа, которое заключено в [ ] присвоить значение переменной, числа могут быть разной длины каждое »

С такими числами именно, CMD работать не умеет... решение можно реализовать на powershell. Для реализации необходимо описать задачу, а не попытку/способ её решения.

DJ Mogarych 19-11-2021 09:29 2972488

Powershell
Код:

$a,$b,$c,$d = ((gc 'D:\temp\test.txt') -replace ".*?\[(.*?)\].*",'$1').Trim().Split()

boomdeamon 19-11-2021 09:42 2972490

Цитата:

Цитата YuS_2
С такими числами именно, CMD работать не умеет... решение можно реализовать на powershell. Для реализации необходимо описать задачу, а не попытку/способ её решения. »

Хорошо если с числами не умеет работать то можно оставить как строку, понятно что на powershell можно реализовать, но нужно CMD, понятно что нужно в цикле перебрать символы входной строки, найти [ как начало фрагмента и собирать посимвольно строку из символов, где разделитель между ними пробел и конец фрагмента ] но пока не разобрался как.

YuS_2 19-11-2021 10:00 2972493

Цитата:

Цитата boomdeamon
если с числами не умеет работать то можно оставить как строку »

Цитата:

Цитата boomdeamon
нужно в цикле перебрать символы входной строки, найти [ как начало фрагмента и собирать посимвольно строку из символов, где разделитель между ними пробел и конец фрагмента ] »

Если файлы, показанные Вами, всегда в таком формате, то разделителя достаточно в виде пробела...
Код:

@echo off
for /f "tokens=8-11 delims= " %%a in (test.txt) do set "a=%%a"&set "b=%%b"&set "c=%%c"&set "d=%%d"
echo [%a%]-[%b%]-[%c%]-[%d%]
pause&exit /b

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

Ну и сравните код powershell, лишенный всех подобных недостатков, при этом с числами можно работать именно как с числами, а не как с текстом:
Код:

$file = '.\dirlist.txt'
$arr=@()
foreach($item in ((gc $file -enc utf8) -split " |\[|\]"|?{$_ -match '^\d+$'})){$arr += [bigint]"$item"}
$arr


megaloman 19-11-2021 10:38 2972496

Еще вариант:
Код:

@Echo Off
cls
        Set "FileIn=D:\Мой контент\Загрузки\dirlist.txt"
        Set "KeyWord=remote result (not to be trusted):"

        If Not Exist "%FileIn%" (Echo File "%FileIn%" not found &Pause &Exit /B 2)
        For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul FINDSTR /I "%KeyWord%" "%FileIn%"`) Do Call :Out "a" "b" "c" "d"  %%s
        Echo a=%a% &Echo b=%b% &Echo c=%c% &Echo d=%d% 
Pause
Exit /B

:Out
        Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

При этом в файле строка может быть не единственной, вместе с иными строками, без этой указанной ключевой фразы.
Цитата:

Цитата YuS_2
Если квадратные скобки не всегда обрамляются пробелами »

- здесь это глубоко безразлично, лишь бы [] были, и не важно, сколько пробелов до и между числами.

YuS_2 19-11-2021 12:12 2972502

Цитата:

Цитата megaloman
При этом в файле строка может быть не единственной, вместе с иными строками, без этой указанной ключевой фразы. »

Это да, без описания задачи и реальных данных... можно предполагать, что угодно...
Например, что количество переменных должно быть не четыре, а неограниченно много, по сумме необходимых строк, в итоге. :)

В варианте для powershell, об этом задумываться не надо, все числа будут в массиве, по сути - на каждое число по переменной.

Цитата:

Цитата megaloman
здесь это глубоко безразлично, лишь бы [] были, и не важно, сколько пробелов до и между числами. »

Да, точно, в cmd же разделители складываются, если идут подряд... ну, тогда и усложнения не потребуется...

boomdeamon 19-11-2021 13:18 2972506

Вложений: 2
Спасибо за помощь, да если интересует вся задача целиком, то могу ее описать, та как дальше столкнулся со следующими проблема так как в CMD не силен от слова совсем.

Есть 10 так называемых гиверов:
Set Giver0=kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN
Set Giver1=kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-
Set Giver2=kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV
Set Giver3=kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ
Set Giver4=kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6
Set Giver5=kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF
Set Giver6=kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8
Set Giver7=kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm
Set Giver8=kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7
Set Giver9=kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N

Передавая каждому из гиверов через внешнюю программку lite-client.exe(в качестве передаваемого параметра идет сам гивер) она возвращает параметры, которые можно записать в файл, а можно и на лету обработать
lite-client.exe -v 0 -C global.config.json -rc "runmethod %Giver0% get_pow_params" >%file%

в таком виде выдает параметры
using liteserver 24 with addr [54.157.78.74:32000]
zerostate set to -1:17A3A92992AABEA785A7A090985A265CD31F323D849DA51239737E321FB05569:5E994FCF4D425C0A6CE6A792594B71732 05F740A39CD56F537DEFD28B48A0F6E
latest masterchain block known to server is (-1,8000000000000000,16193696):BC4F543DDD3DD7E91AF970BE1016A43E73405A27538E2F967D4161BFDA3BC3DD:8FAE84 41576BB5AFECFC0D295FE3B234771DDB223800F7CF68493542C8399031 created at 1637308490 (4 seconds ago)
BLK#1 = (-1,8000000000000000,16193696):BC4F543DDD3DD7E91AF970BE1016A43E73405A27538E2F967D4161BFDA3BC3DD:8FAE84 41576BB5AFECFC0D295FE3B234771DDB223800F7CF68493542C8399031
BLK#2 = (-1,8000000000000000,0):17A3A92992AABEA785A7A090985A265CD31F323D849DA51239737E321FB05569:5E994FCF4D425 C0A6CE6A792594B7173205F740A39CD56F537DEFD28B48A0F6E
arguments: [ 101616 ]
result: [ 240981390008640605705570785453111617011 63407965974365185119488504750453864583808513014607073315407340 100000000000 256 ]
remote result (not to be trusted): [ 240981390008640605705570785453111617011 63407965974365185119488504750453864583808513014607073315407340 100000000000 256 ]

Из всего это участка данных интересуют значения в строке, точнее сейчас именно одно значение, раньше больше значений нужно было, это второе значение в []
remote result (not to be trusted): [ 240981390008640605705570785453111617011 63407965974365185119488504750453864583808513014607073315407340 100000000000 256 ]
в нашем случае это значение таково:
Complex=63407965974365185119488504750453864583808513014607073315407340
оно может быть переменной длины, каждый гивер дает свое значение

Необходимо опросить каждый из десяти гиверов и выбрать тот из гиверов BestGiver у которого искомое значение Complex будет наибольшим и передать эти значения BestGiver в другую программу

tonlib-cuda-cli.exe -v 3 -C %CONFIG_FILE% -e "pminer start %BestGiver% %MY_ADDR% %GPU_ID% %BOOST_FACTOR% %GPU_PLATFORM_ID%"

Сейчас параметры для запуска программы считываются из ini файла run_config.ini
и далее уже запускаются в bat файле run_cuda.bat
батники и ini фал прикрепил
сейчас Гивер задан жестко, а нужно выбирать наилучшего и запускать работу tonlib-cuda-cli.exe только с лучшим гивером BestGiver

не могу подгрузить файлы целиком вроде для архивов 8 мегабайт, но мне дает только 1 мегабайт использовать
https://github.com/tontechio/pow-min...tag/20211119-4

YuS_2 19-11-2021 13:59 2972507

Цитата:

Цитата boomdeamon
это второе значение в [] »

Цитата:

Цитата boomdeamon
Необходимо опросить каждый из десяти гиверов и выбрать тот из гиверов BestGiver у которого искомое значение Complex будет наибольшим и передать эти значения BestGiver в другую программу »

Вот тут и вступит ограничение CMD, в числовых значениях, ибо сравнить их не получится, а сравнение литеральных значений чисел приведет к неожиданным результатам. Это легко пронаблюдать, например в таком выражении:
Код:

if "11" gtr "102" (echo Yes) else (echo No)
которое выдаст результат "Yes", хотя 11, явно не больше 102
Так что, выход только один - переходить на powershell и в нем уже организовывать сравнение чисел...

Вашу строку:
Цитата:

Цитата boomdeamon
lite-client.exe -v 0 -C global.config.json -rc "runmethod %Giver0% get_pow_params" »

можно запускать и в powershell и возможно, даже получать выходные данные по конвейеру, с целью дальнейшего их применения в коде...
Но чтобы не делать сизифов труд, тут необходимо Ваше желание в использовании powershell, а где-то даже его и изучение :)

ЗЫ И как, майнинг - доходное дело? Получается что-то намайнить? :)

boomdeamon 19-11-2021 14:11 2972509

Цитата:

Цитата YuS_2
которое выдаст результат "Yes", хотя 10001, явно не меньше и уж тем более, не равно 1002
Так что, выход только один - переходить на powershell и в нем уже организовывать сравнение чисел... »

Это я понял что некорректно идет сравнение строк таких, выход я придумал, но реализовать не получилось, первое узнать длину строки и выбирать из них с большей длиной, если строк больше одной, то выбирать ту у которой первая цифра больше(хотят тут проблема будет правильно сравнивать 9 будет в строке больше 5 )) ), если опять больше одной строки то проверять вторую цифру и выбирать ту что больше и дальше уже не важно можно остановиться и выбирать любой из гиверов где комплекс будет удовлетворять описанным условиям, но реализовать пока знаний не хватает )

boomdeamon 19-11-2021 14:29 2972513

Цитата:

Цитата YuS_2
ЗЫ И как, майнинг - доходное дело? Получается что-то намайнить? »

да один раз удалось поймать вознаграждение за 25 дней и да получилось выгодно, но если бы не пошло то были бы сильные убытки, конкретно этот майнинг сильная лотерея, есть со стабильным небольшим доходом, а тут возможность выловить рыбку в мутной воде, особенно сейчас когда в начале ноября появился майнинг на винде, до этого он был на убунту(на убунту кстати выбор гивера реализован был, на винду его не перенесли разрабы) и сложность сети была в 5 раз легче, но набежало сейчас много народу, каждый хочет либо удачу за хвост поймать на слабом железе, либо кто то приходит на серьезном железе и гребет, но тоже с элементом удачи, так как каждая видеокарта делает расчет в соло и пулов нет и как говорят админы не будет. Так что днем работаю под виндой, а после работы переключаю на убунту, где есть выбор лучшего гивера

YuS_2 19-11-2021 14:34 2972514

Цитата:

Цитата boomdeamon
реализовать не получилось, первое узнать длину строки и выбирать из них с большей длиной, если строк больше одной, то выбирать ту у которой первая цифра больше »

Как вариант, конечно, можно и так... т.е. если длина больше, то и число больше. Если же длина одинаковая, то сравнивать посимвольно от первой цифры... это тоже не проблема организовать и даже будет работать...
Вот, только реализовывать - мне лично, лень вспоминать CMD, ибо с powershell-ом всё гораздо проще решается, а cmd фактически уже не пользуюсь и многое позабылось...
Но возможно, кому-нибудь захочется это реализовать... просто подождать надо.

boomdeamon 19-11-2021 14:35 2972516

Да я согласен и на powershell если на нем задача целиком решается

megaloman 19-11-2021 20:22 2972534

Вложений: 1
YuS_2, boomdeamon,
Цитата:

Цитата YuS_2
Вот тут и вступит ограничение CMD, в числовых значениях, ибо сравнить их не получится, а сравнение литеральных значений чисел приведет к неожиданным результатам. »

ИМХО, предсказуемым. Строки, ИМХО, сравниваются слева направо, поэтому "624" >"1074573547578" так как "6">"1"
Поэтому извратимся: приделаем к началу цифровой строки для удобства обозначения границы буковку, например, z (потом пригодится для усекновения лишнего) и, допустим, 120 нулей.
Далее, отрежем от конца 120 символов, приделаем к этой строке префикс, например, @@, получим набор одинаковых по длине строк, и сделаем финт: используем эту строку как имя переменной, присвоим ей номер гивера.
Получим (в сокращенном виде, длинную строку лень рисовать) нечто подобное @@0000000z123454=4
Далее Set "@@" выдаст номера гиверов в порядке возрастания их строковых значений, а вычленить из имени переменной гивер (помним о буковке z) не составляет труда.
Код:

@Echo Off
cls
        Set "KeyWord=remote result (not to be trusted):"

        Set "Prefix=Giver"
        Set "Giver0=kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN"
        Set "Giver1=kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-"
        Set "Giver2=kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV"
        Set "Giver3=kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ"
        Set "Giver4=kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6"
        Set "Giver5=kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF"
        Set "Giver6=kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8"
        Set "Giver7=kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm"
        Set "Giver8=kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7"
        Set "Giver9=kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N"

        For /L %%i In (0,1,9) Do (
                For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul Call More  "Z:\Box_In\%%%Prefix%%%i%%" ^| FINDSTR /I "%KeyWord%"`) Do Call :Out "a" "Complex" "c" "d"  %%s
rem                For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul Call lite-client.exe -v 0 -C global.config.json -rc "runmethod %%%Prefix%%%i%% get_pow_params" ^| FINDSTR /I "%KeyWord%"`) Do Call :Out "a" "Complex" "c" "d"

                Call Set "Name=000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000z%%Complex%%"
                Call Set "Name=@@%%Name:~-120%%"
                Call Set "%%Name%%=%%i"
        )

        For /F "usebackq tokens=1,2 delims==" %%i In (`Set "@@"`) Do (
                Set "nBestGiver=%%j"
                Set "BestGiver=%%i"
                Call Set "BestGiver=%%BestGiver:*z=%%"
                Call Set "Out=                                                                                      %%BestGiver%%"
                Call Echo %%j=%%Out:~-100%%
        )
Echo. &Echo nBestGiver=%Prefix%%nBestGiver%  &Echo MaxComplex=%BestGiver% &Call Echo BestGiver =%%%Prefix%%nBestGiver%%% 

Pause
Exit /B

:Out
        Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

Естественно, отладить задачу целиком не могу, нет программ, на которые ссылается заказчик. Но создание файлов в боевом варианте (эта строка заремлена) не предполагается.
Для отладки применил обходной маневр: создал 10 файлов с именами совпадающими с гиверами (не знаю, что это такое и вряд ли захочу узнать), как указано у заказчика, в которых записал содержимое, которое, как я понял, выдаёт программа lite-client.exe. И вместо этой программы стандартным морем выдаю содержимое для обработки (в красной отладочной строке). Естественно, данные слегка изменил, чтобы иметь возможность для сортировки.
Набор этих отладочных файлов прилагаю - вдруг кто-то захочет попробовать, только путь надо будет вместо Z:\Box_In свой прописать)
В принципе, вся задача, которая сводится к сортировке длинных цифровых строк, в CMD решается.

boomdeamon 19-11-2021 22:45 2972546

Цитата:

Цитата megaloman
Естественно, отладить задачу целиком не могу, нет программ, на которые ссылается заказчик. Но создание файлов в боевом варианте (эта строка заремлена) не предполагается.
Для отладки применил обходной маневр: создал 10 файлов с именами совпадающими с гиверами (не знаю, что это такое и вряд ли захочу узнать), как указано у заказчика, в которых записал содержимое, которое, как я понял, выдаёт программа lite-client.exe. И вместо этой программы стандартным морем выдаю содержимое для обработки (в красной отладочной строке). Естественно, данные слегка изменил, чтобы иметь возможность для сортировки.
Набор этих отладочных файлов прилагаю - вдруг кто-то захочет попробовать, только путь надо будет вместо Z:\Box_In свой прописать)
В принципе, вся задача, которая сводится к сортировке длинных цифровых строк, в CMD решается. »

Да решение для анализа строки интересное, мне понравилось, супер.

К сожалению не заработал скрипт и думаю проблема в том что из-за перенаправлений ввода и вывода lite-client.exe не успевает отдать весь фрагмент вывода и видимо в данном случае нужно использовать вывод в отдельный временный файл,
For /F "usebackq tokens=2 delims=[]" %%s In (lite-client.exe -v 0 -C global.config.json -rc "runmethod %%%Prefix%%%i%% get_pow_params" >%file%)

а потом уже это файл парсить как в примере, так как пример именно с файлом да отлично справляется, когда фрагмент в файле.
А по результату работы примера, да пример вычисляется, только BestGiver это должно быть одно из значений одного из десяти гиверов, а в примере туда подставляется наибольший Complex, а необходимо значение лучшего гивера
сейчас скрипт выдает значения по тестовым данным
nBestGiver=Giver5 BestGiver=363407965974365185119488504750453864583808513014607073315407340
а надо
nBestGiver=Giver5 Complex=363407965974365185119488504750453864583808513014607073315407340 BestGiver=kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF

megaloman 20-11-2021 00:19 2972559

Цитата:

Цитата boomdeamon
а надо
nBestGiver=Giver5
Complex=363407965974365185119488504750453864583808513014607073315407340
BestGiver=kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF »

- исправил.
Хотелось бы разобраться, почему К сожалению не заработал скрипт и не думаю что проблема из-за перенаправлений ввода и вывода, но надо больше информации.
Я иду у Вас на поводу и выделяю формирование файлов отдельно.
Код:

@Echo Off
cls
        Set "BoxOut=Z:\Box_Out"

        Set "Prefix=Giver"
        Set "Giver0=kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN"
        Set "Giver1=kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-"
        Set "Giver2=kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV"
        Set "Giver3=kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ"
        Set "Giver4=kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6"
        Set "Giver5=kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF"
        Set "Giver6=kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8"
        Set "Giver7=kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm"
        Set "Giver8=kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7"
        Set "Giver9=kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N"

        Set "KeyWord=remote result (not to be trusted):"

        For /L %%i In (0,1,9) Do (
                Call :Giver "%BoxOut%" "%%%Prefix%%%i%%"
                >nul Call Copy "Z:\Box_In\%%%Prefix%%%i%%" "%BoxOut%\"
        )

        For /L %%i In (0,1,9) Do (
                For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul Call More  "%BoxOut%\%%%Prefix%%%i%%" ^| FINDSTR /I "%KeyWord%"`) Do Call :Out "a" "Complex" "c" "d"  %%s

                Call Set "Name=000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000z%%Complex%%"
                Call Set "Name=@@%%Name:~-120%%"
                Call Set "%%Name%%=%%i"
        )

        For /F "usebackq tokens=1,2 delims==" %%i In (`Set "@@"`) Do (
                Set "nBestGiver=%%j"
                Set "BestGiver=%%i"
                Call Set "BestGiver=%%BestGiver:*z=%%"
                Call Set "Out=                                                                                      %%BestGiver%%"
                Call Echo %%j=%%Out:~-100%%
        )
Echo. &Echo nBestGiver=%Prefix%%nBestGiver%  &Echo MaxComplex=%BestGiver% &Call Echo BestGiver =%%%Prefix%%nBestGiver%%% 
Pause
Exit /B

:Out
        Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

:Giver
        2>nul Del "%~1\%~2"
        Echo lite-client.exe -v 0 -C global.config.json -rc "runmethod %~2 get_pow_params"
        2>nul >>"%~1\%~2" lite-client.exe -v 0 -C global.config.json -rc "runmethod %~2 get_pow_params"
Exit /B

Строка, выделенная красным - отладочная. И отладочные файлы всё те же. Её надо убрать при боевой работе, она будет мешать. Путь, указанный в Set "BoxOut=Z:\Box_Out" пропишите свой, там будут писаться файлы

boomdeamon 20-11-2021 00:41 2972562

Цитата:

Цитата megaloman
- исправил. »

Но именно так не заработало, но заработало вот так более топорно конечно я дописал, где каждый cmd содержит вызов своего гивера
lite-client.exe -v 0 -C global.config.json -rc "runmethod kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN get_pow_params">kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN

@Echo Off
cls
Set "KeyWord=remote result (not to be trusted):"

Set "Prefix=Giver"
Set "Giver0=kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN"
Set "Giver1=kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-"
Set "Giver2=kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV"
Set "Giver3=kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ"
Set "Giver4=kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6"
Set "Giver5=kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF"
Set "Giver6=kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8"
Set "Giver7=kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm"
Set "Giver8=kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7"
Set "Giver9=kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N"


call kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN.cmd
call kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-.cmd
call kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV.cmd
call kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ.cmd
call kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6.cmd
call kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF.cmd
call kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8.cmd
call kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm.cmd
call kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7.cmd
call kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N.cmd

For /L %%i In (0,1,9) Do (
For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul Call More "%%%Prefix%%%i%%" ^| FINDSTR /I "%KeyWord%"`) Do Call :Out "a" "Complex" "c" "d" %%s

Call Set "Name=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000000000000000000z%%Complex%%"
Call Set "Name=@@%%Name:~-120%%"
Call Set "%%Name%%=%%i"
)

For /F "usebackq tokens=1,2 delims==" %%i In (`Set "@@"`) Do (
Set "nBestGiver=%%j"
Set "BestGiver=%%i"
Call Set "BestGiver=%%BestGiver:*z=%%"
Call Set "Out= %%BestGiver%%"
Call Echo %%j=%%Out:~-100%%
)


Echo. &Echo nBestGiver=%Prefix%%nBestGiver% &Echo MaxComplex=%BestGiver% &Call Echo BestGiver=%%%Prefix%%nBestGiver%%%
Pause
Exit /B

:Out
Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

megaloman 20-11-2021 00:47 2972563

boomdeamon, не знаю, что в ваших CMD, явно будет удобнее, чтобы не рисовать одно и то же дважды:
Код:

Call %Giver0%.cmd
Call %Giver1%.cmd
Call %Giver2%.cmd
Call %Giver3%.cmd
Call %Giver4%.cmd
Call %Giver5%.cmd
Call %Giver6%.cmd
Call %Giver7%.cmd
Call %Giver8%.cmd
Call %Giver9%.cmd


YuS_2 20-11-2021 08:22 2972583

Цитата:

Цитата megaloman
ИМХО, предсказуемым. »

по сути, да, предсказуемо не с тем результатом, который хотелось бы получать, ибо сравнение строк (пусть и с цифровыми литералами) на больше-меньше, должно происходить не на уровне посимвольного сравнения, с результатом операции по первым символам, а как минимум, на длину строки... но, увы, это ведь cmd... :)
Цитата:

Цитата megaloman
вычленить из имени переменной гивер (помним о буковке z) не составляет труда. »

Отвык я составлять подобные алгоритмы... лучше таки powershell применять - и проще, и понятнее, и гораздо гибче...

В общем:
boomdeamon, если не выйдет соорудить код на CMD, то попробуем на powershell.
Не хочется вникать в сам майнинг и запускать эти программы у себя, но чтобы написать код, необходимо тестировать сами программы и проверять, что у них на выходе... в крайнем случае, можно будет через внешний файл работать.

YuS_2 20-11-2021 14:00 2972600

Цитата:

Цитата boomdeamon
Но именно так не заработало, но заработало вот так более топорно конечно я дописал, где каждый cmd содержит вызов своего гивера »

В общем, можно перейти на компромисс, гибрид cmd+powershell...
Примерно так:
1. Создаем новый батник run_cuda_new.bat
run_cuda_new.bat

Код:

@echo off

for /F "tokens=*" %%I in (run_config.ini) do set %%I

set "LOG="
if "%USE_LOG%"=="Y" (
  set "LOG=-l %LOG_FILE%"
)

title GPU %GPU_ID% CUDA log=%USE_LOG%

REM =======begin вставка 1=======
set "folder=.\1\"

set givers="kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN" "kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-" "kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV" "kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ" "kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6" "kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF" "kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8" "kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm" "kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7" "kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N"

for %%a in (%givers%) do set "giver=%%~a"&call :test

for /f "tokens=1,2 delims= " %%x in ('powershell -ex bypass .\script.ps1') do (
        set GIVER_ADDR=%%x
)
REM =======end вставка 1=======

echo on
:_minerstart
tonlib-cuda-cli.exe -V
tonlib-cuda-cli.exe -v 3 -C %CONFIG_FILE% -e "pminer start %GIVER_ADDR% %MY_ADDR% %GPU_ID% %BOOST_FACTOR% %GPU_PLATFORM_ID%" %LOG%
goto _minerstart

pause&exit /b

REM =======begin вставка 2=======
:test
lite-client.exe -v 0 -C global.config.json -rc "runmethod %giver% get_pow_params" >"%folder%%giver%.txt"
REM =======end вставка 2=======


- отличается от оригинального вставленным кодом из двух частей (пометки на вставки есть)
Giver-ы записаны в переменную %Givers% (каждый отдельно, в двойных кавычках и друг от друга отделяются пробелом)
В процессе работы будет создан каталог "1" (имя можно изменить, но если менять, то и в батнике, и в скрипте powershell одновременно), в котором будут формироваться результаты работы тестирования lite-client.exe, в текстовых файлах с именами Giver-ов.

2. Скрипт powershell script.ps1 (сохранить лучше в UTF8 с BOM и разместить надо рядом с run_cuda_new.bat):
script.ps1
Код:

$folder = '.\1'
$flt = '*.txt'
$arr=@()
(dir $folder -filter $flt -file|%{
        $arr = (gc $_.fullname -enc utf8|
        ?{$_ -match 'remote result'}) -split " |\[|\]"|?{$_ -match '^\d+$'}
        [pscustomobject]@{
                Giver = $_.basename
                Complex = [bigint]::parse($arr[1])
        }
}|sort Complex -d|select -first 1|ft -hid|out-string).trim()


- в powershell анализируются результаты тестов Giver-ов, выбирается единственный по наибольшему значению:
Цитата:

Цитата boomdeamon
Из всего это участка данных интересуют значения в строке, точнее сейчас именно одно значение, раньше больше значений нужно было, это второе значение в [] »

и передается назад в виде двух значений "Giver Complex" в CMD, где уже происходит, собственно, дальнейший запуск tonlib-cuda-cli.exe (как в оригинальном батнике), но уже с новым, выбранным Giver-ом (c наибольшим Complex).
- Это если, конечно, я верно осмыслил задачу... если что не так, поправить можно легко...

PS Да, powershell должен быть v 5.1... на более старых версиях работоспособность не гарантируется. :)

megaloman 20-11-2021 16:36 2972623

YuS_2,
Цитата:

Цитата YuS_2
В общем, можно перейти на компромисс, гибрид cmd+powershell... »

Одна голова хорошо, а две - уродство. :)
boomdeamon,
Вот вариант CMD. Вычистил от извращений из-за недомыслия в постановке.
Оставил за вами организацию промежуточного файла, хотя, ИМХО, можно бы было обойтись и без него.
Код:

@Echo Off
cls
        Set "KeyWord=remote result (not to be trusted):"
        Set /A N=0

        Call :@ kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN
        Call :@ kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-
        Call :@ kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV
        Call :@ kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ
        Call :@ kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6
        Call :@ kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF
        Call :@ kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8
        Call :@ kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm
        Call :@ kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7
        Call :@ kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N

        If %N%==0 (Echo !!! Данные не получены. &Exit /B 2)

        Call :Giver

        Echo. &Echo nBestGiver=%nBestGiver%  &Echo MaxComplex=%MaxComplex% &Echo BestGiver =%BestGiver% 
Pause
Exit /B

:@
        Set "OutFile=%Tmp%\%~nx0.giver"
rem        lite-client.exe -v 0 -C global.config.json -rc "runmethod %1 get_pow_params" >"%OutFile%"
        >nul Copy "Z:\Box_In\%1" "%OutFile%"


        Set "Complex="
        For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul FINDSTR /I "%KeyWord%" "%OutFile%"`) Do Call :Out "a" "Complex" "c" "d"  %%s
        If "%Complex%"=="" (Echo !!! %1 не получены данные &Exit /B 2)

        2>nul Del "%OutFile%"
        Set /A N+=1
        Set "NN=%N% "
        Echo Giver%NN:~0,2% = %1

        Call Set "Name=000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000z%%Complex%%"
        Call Set "Name=@@%%Name:~-120%%"
        Call Set "%%Name%%=%1=%N%"
Exit /B

:Out
        Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

:Giver
        Echo.
        For /F "usebackq tokens=1,2,3 delims==" %%i In (`Set "@@"`) Do (
                Set "nBestGiver=%%k"
                Set "MaxComplex=%%i"
                Call Set "MaxComplex=%%MaxComplex:*z=%%"
                Call Set "Out=                                                                                      %%MaxComplex%%"
                Set "NN= %%k"
                Call Echo %%NN:~-2%% =%%Out:~-100%%
                Set "BestGiver=%%j"
        )
Exit /B

Естественно, я получаю данные в суррогатном отладочном варианте. В боевом варианте надо
Код:

        lite-client.exe -v 0 -C global.config.json -rc "runmethod %1 get_pow_params" >"%OutFile%"
rem        >nul Copy "Z:\Box_In\%1" "%OutFile%"

Если всё же данные Вы получаете из другого CMD, я бы посоветовал его встроить в этот.

boomdeamon 20-11-2021 18:50 2972640

Подскажите возникла такая проблема, когда последовательно выполняются данные командники, то иногда происходит зависание и работа общего батника останавливается, как обработать исключение, например если 5 секунд нет ответа то переходить к выполнению следующей строки cmd ?
внутри командника такой код, для каждого со своими параметрами
lite-client.exe -v 0 -C global.config.json -rc "runmethod kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN get_pow_params">kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN


call kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN.cmd
call kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-.cmd
call kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV.cmd
call kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ.cmd
call kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6.cmd
call kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF.cmd
call kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8.cmd
call kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm.cmd
call kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7.cmd
call kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N.cmd

megaloman 20-11-2021 20:28 2972648

Цитата:

Цитата boomdeamon
внутри командника такой код, для каждого со своими параметрами »

В чём разные параметры? Только в имени "гивера" ?
Вот вариант с запуском вашей процедуры (уточните, в чем отличаются параметры, возможно это уточнить при её вызове)
Введено время ожидания её завершения.
По истечении этого времени она будет убита.
Код:

@Echo Off
cls
        Set "KeyWord=remote result (not to be trusted):"
        Set /A WaitSec=10
        Set /A N=0

        Call :@ kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN
        Call :@ kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-
        Call :@ kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV
        Call :@ kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ
        Call :@ kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6
        Call :@ kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF
        Call :@ kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8
        Call :@ kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm
        Call :@ kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7
        Call :@ kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N

        If %N%==0 (Echo !!! Данные не получены. &Exit /B 2)

        Call :Giver

        Echo. &Echo nBestGiver=%nBestGiver%  &Echo MaxComplex=%MaxComplex% &Echo BestGiver =%BestGiver% 
Pause
Exit /B

:@
        Set "OutFile=%Tmp%\%~1"
        Call :Client %1 "%OutFile%"

        Set "Complex="
        For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul FINDSTR /I "%KeyWord%" "%OutFile%"`) Do Call :Out "a" "Complex" "c" "d"  %%s
        2>nul Del "%OutFile%"

        If "%Complex%"=="" (Echo !!! %1 не получены данные &Exit /B 2)

        Set /A N+=1
        Set "NN=%N% "
        Echo Giver%NN:~0,2% = %1

        Call Set "Name=000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000z%%Complex%%"
        Call Set "Name=@@%%Name:~-120%%"
        Call Set "%%Name%%=%1=%N%"
Exit /B

:Out
        Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

:Giver
        Echo.
        For /F "usebackq tokens=1,2,3 delims==" %%i In (`Set "@@"`) Do (
                Set "nBestGiver=%%k"
                Set "MaxComplex=%%i"
                Call Set "MaxComplex=%%MaxComplex:*z=%%"
                Call Set "Out=                                                                                      %%MaxComplex%%"
                Set "NN= %%k"
                Call Echo %%NN:~-2%% =%%Out:~-100%%
                Set "BestGiver=%%j"
        )
Exit /B

:Client
        Set "Exe=lite-client.exe"
rem        Set "PathExe=Z:\Soft_In\WinSolit\"
        Set "PathExe="

        Start " " "%PathExe%%Exe%" -v 0 -C global.config.json -rc "runmethod %1 get_pow_params" >%2

        TimeOut /T %WaitSec%
        >nul 2>&1 TaskKill /IM "%Exe%"
 
rem        >nul Copy "Z:\Box_In\%1" %2
Exit /B

Тестировал на имитации ваших процессов

megaloman 21-11-2021 16:57 2972711

boomdeamon, сколько времени в норме отрабатывает программа lite-client.exe? Как идея: запускать эту утилиту 10 раз со своими настройками по очереди с некоторым интервалом, приблизительно равным среднему времени на отработку без ожидания завершения через START, каждая сохранит результат работы в свой файл, и, после всей этой десятки, после некоторого интервала, убить задачи, которые не успели отработать (зависли?)
Реализовано
Код:

@Echo Off
cls
        Set "KeyWord=remote result (not to be trusted):"
        Set /A WaitSec=5
        Set /A WaitGlobalSec=20

        Set "Exe=lite-client.exe"
        Set "PathExe="
rem        Set "PathExe=Z:\Soft_In\WinSolit\"

        Set "OutDir=%Tmp%"

        Set /A N=0, M=100
        Call :@ kf-kkdY_B7p-77TLn2hUhM6QidWrrsl8FYWCIvBMpZKprBtN
        Call :@ kf8SYc83pm5JkGt0p3TQRkuiM58O9Cr3waUtR9OoFq716lN-
        Call :@ kf-FV4QTxLl-7Ct3E6MqOtMt-RGXMxi27g4I645lw6MTWraV
        Call :@ kf_NSzfDJI1A3rOM0GQm7xsoUXHTgmdhN5-OrGD8uwL2JMvQ
        Call :@ kf8gf1PQy4u2kURl-Gz4LbS29eaN4sVdrVQkPO-JL80VhOe6
        Call :@ kf8kO6K6Qh6YM4ddjRYYlvVAK7IgyW8Zet-4ZvNrVsmQ4EOF
        Call :@ kf-P_TOdwcCh0AXHhBpICDMxStxHenWdLCDLNH5QcNpwMHJ8
        Call :@ kf91o4NNTryJ-Cw3sDGt9OTiafmETdVFUMvylQdFPoOxIsLm
        Call :@ kf9iWhwk9GwAXjtwKG-vN7rmXT3hLIT23RBY6KhVaynRrIK7
        Call :@ kf8JfFUEJhhpRW80_jqD7zzQteH6EBHOzxiOhygRhBdt4z2N

        >nul TimeOut /T %WaitSec%
        TaskList /fo csv |>nul Find /I "%Exe%" && (TimeOut /T %WaitGlobalSec% &>nul 2>&1 TaskKill /IM "%Exe%")

rem        For /F "usebackq tokens=2 delims==" %%g In (`Set "Giver@"`) Do        >nul Copy "Z:\Box_In\%%g" "%OutDir%\"
        For /F "usebackq tokens=2 delims==" %%g In (`Set "Giver@"`) Do Call :@1 %%g

        If %N%==0 (Echo !!! Данные не получены. &Exit /B 2)

        Call :Giver

        Echo. &Echo nBestGiver=%nBestGiver%  &Echo MaxComplex=%MaxComplex% &Echo BestGiver =%BestGiver% 
Pause
Exit /B

:@1
        Set "Complex="
        For /F "usebackq tokens=2 delims=[]" %%s In (`2^>nul FINDSTR /I "%KeyWord%" "%OutDir%\%~1"`) Do Call :Out "a" "Complex" "c" "d"  %%s
        2>nul Del "%OutDir%\%~1"

        If "%Complex%"=="" (Echo !!! %1 не получены данные &Exit /B 2)

        Set /A N+=1
        Set "NN=%N% "
        Echo Giver%NN:~0,2% = %1

        Call Set "Name=000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000z%%Complex%%"
        Call Set "Name=@@%%Name:~-120%%"
        Call Set "%%Name%%=%1=%N%"
Exit /B

:Out
        Set "%~1=%5" &Set "%~2=%6" &Set "%~3=%7" &Set "%~4=%8"
Exit /B

:Giver
        Echo.
        For /F "usebackq tokens=1,2,3 delims==" %%i In (`Set "@@"`) Do (
                Set "nBestGiver=%%k"
                Set "MaxComplex=%%i"
                Call Set "MaxComplex=%%MaxComplex:*z=%%"
                Call Set "Out=                                                                                      %%MaxComplex%%"
                Set "NN= %%k"
                Call Echo %%NN:~-2%% =%%Out:~-100%%
                Set "BestGiver=%%j"
        )
Exit /B

:@
        Set /A M+=1
        Set "Giver@%M%=%~1"

        Start " " "%PathExe%%Exe%" -v 0 -C global.config.json -rc "runmethod %1 get_pow_params" >"%OutDir%\%1"
        >nul TimeOut /T %WaitSec%
Exit /B



Время: 10:25.

Время: 10:25.
© OSzone.net 2001-