Войти

Показать полную графическую версию : Необходимо из файла считать строку и участи строки присвоить переменным


Страниц : [1] 2

boomdeamon
18-11-2021, 22:38
Есть текстовый файл в котором есть строка
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
необходимо для каждое числа, которое заключено в [ ] присвоить значение переменной, числа могут быть разной длины каждое »
С такими числами именно, CMD работать не умеет... решение можно реализовать на powershell. Для реализации необходимо описать задачу, а не попытку/способ её решения.

DJ Mogarych
19-11-2021, 09:29
Powershell

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

boomdeamon
19-11-2021, 09:42
С такими числами именно, CMD работать не умеет... решение можно реализовать на powershell. Для реализации необходимо описать задачу, а не попытку/способ её решения. »
Хорошо если с числами не умеет работать то можно оставить как строку, понятно что на powershell можно реализовать, но нужно CMD, понятно что нужно в цикле перебрать символы входной строки, найти [ как начало фрагмента и собирать посимвольно строку из символов, где разделитель между ними пробел и конец фрагмента ] но пока не разобрался как.

YuS_2
19-11-2021, 10:00
если с числами не умеет работать то можно оставить как строку »
нужно в цикле перебрать символы входной строки, найти [ как начало фрагмента и собирать посимвольно строку из символов, где разделитель между ними пробел и конец фрагмента ] »
Если файлы, показанные Вами, всегда в таком формате, то разделителя достаточно в виде пробела...
@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
Еще вариант:@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
19-11-2021, 12:12
При этом в файле строка может быть не единственной, вместе с иными строками, без этой указанной ключевой фразы. »
Это да, без описания задачи и реальных данных... можно предполагать, что угодно...
Например, что количество переменных должно быть не четыре, а неограниченно много, по сумме необходимых строк, в итоге. :)

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

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

boomdeamon
19-11-2021, 13:18
Спасибо за помощь, да если интересует вся задача целиком, то могу ее описать, та как дальше столкнулся со следующими проблема так как в 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-miner-gpu/releases/tag/20211119-4

YuS_2
19-11-2021, 13:59
это второе значение в [] »
Необходимо опросить каждый из десяти гиверов и выбрать тот из гиверов BestGiver у которого искомое значение Complex будет наибольшим и передать эти значения BestGiver в другую программу »
Вот тут и вступит ограничение CMD, в числовых значениях, ибо сравнить их не получится, а сравнение литеральных значений чисел приведет к неожиданным результатам. Это легко пронаблюдать, например в таком выражении:
if "11" gtr "102" (echo Yes) else (echo No)
которое выдаст результат "Yes", хотя 11, явно не больше 102
Так что, выход только один - переходить на powershell и в нем уже организовывать сравнение чисел...

Вашу строку:
lite-client.exe -v 0 -C global.config.json -rc "runmethod %Giver0% get_pow_params" »
можно запускать и в powershell и возможно, даже получать выходные данные по конвейеру, с целью дальнейшего их применения в коде...
Но чтобы не делать сизифов труд, тут необходимо Ваше желание в использовании powershell, а где-то даже его и изучение :)

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

boomdeamon
19-11-2021, 14:11
которое выдаст результат "Yes", хотя 10001, явно не меньше и уж тем более, не равно 1002
Так что, выход только один - переходить на powershell и в нем уже организовывать сравнение чисел... »
Это я понял что некорректно идет сравнение строк таких, выход я придумал, но реализовать не получилось, первое узнать длину строки и выбирать из них с большей длиной, если строк больше одной, то выбирать ту у которой первая цифра больше(хотят тут проблема будет правильно сравнивать 9 будет в строке больше 5 )) ), если опять больше одной строки то проверять вторую цифру и выбирать ту что больше и дальше уже не важно можно остановиться и выбирать любой из гиверов где комплекс будет удовлетворять описанным условиям, но реализовать пока знаний не хватает )

boomdeamon
19-11-2021, 14:29
ЗЫ И как, майнинг - доходное дело? Получается что-то намайнить? »
да один раз удалось поймать вознаграждение за 25 дней и да получилось выгодно, но если бы не пошло то были бы сильные убытки, конкретно этот майнинг сильная лотерея, есть со стабильным небольшим доходом, а тут возможность выловить рыбку в мутной воде, особенно сейчас когда в начале ноября появился майнинг на винде, до этого он был на убунту(на убунту кстати выбор гивера реализован был, на винду его не перенесли разрабы) и сложность сети была в 5 раз легче, но набежало сейчас много народу, каждый хочет либо удачу за хвост поймать на слабом железе, либо кто то приходит на серьезном железе и гребет, но тоже с элементом удачи, так как каждая видеокарта делает расчет в соло и пулов нет и как говорят админы не будет. Так что днем работаю под виндой, а после работы переключаю на убунту, где есть выбор лучшего гивера

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

boomdeamon
19-11-2021, 14:35
Да я согласен и на powershell если на нем задача целиком решается

megaloman
19-11-2021, 20:22
YuS_2, boomdeamon, Вот тут и вступит ограничение 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=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000z%%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
Естественно, отладить задачу целиком не могу, нет программ, на которые ссылается заказчик. Но создание файлов в боевом варианте (эта строка заремлена) не предполагается.
Для отладки применил обходной маневр: создал 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
а надо
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=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000z%%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
- исправил. »
Но именно так не заработало, но заработало вот так более топорно конечно я дописал, где каждый 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=00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000z%%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
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
ИМХО, предсказуемым. »
по сути, да, предсказуемо не с тем результатом, который хотелось бы получать, ибо сравнение строк (пусть и с цифровыми литералами) на больше-меньше, должно происходить не на уровне посимвольного сравнения, с результатом операции по первым символам, а как минимум, на длину строки... но, увы, это ведь cmd... :)
вычленить из имени переменной гивер (помним о буковке z) не составляет труда. »
Отвык я составлять подобные алгоритмы... лучше таки powershell применять - и проще, и понятнее, и гораздо гибче...

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

YuS_2
20-11-2021, 14:00
Но именно так не заработало, но заработало вот так более топорно конечно я дописал, где каждый cmd содержит вызов своего гивера »
В общем, можно перейти на компромисс, гибрид cmd+powershell...
Примерно так:
1. Создаем новый батник 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):
$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-ов, выбирается единственный по наибольшему значению:
Из всего это участка данных интересуют значения в строке, точнее сейчас именно одно значение, раньше больше значений нужно было, это второе значение в [] »
и передается назад в виде двух значений "Giver Complex" в CMD, где уже происходит, собственно, дальнейший запуск tonlib-cuda-cli.exe (как в оригинальном батнике), но уже с новым, выбранным Giver-ом (c наибольшим Complex).
- Это если, конечно, я верно осмыслил задачу... если что не так, поправить можно легко...

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




© OSzone.net 2001-2012