cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Приветствую! Появилась задачка, вроде как сам решил, но захотелось немного посоветоваться. - Есть скрипт, в главном меню номера пунктов. - Вводим номера (через пробел или запятую) пунктов которые нужно выполнить. - Через "set /p" строка с номерами попадает в переменную %var%, далее она разбирается в цикле, и происходит поочередный вызов меток с введенными номерами. Захотелось реализовать возможность вводить группы пунктов через дефис, что-то типа такого: "10 12 20-27 35 40-48" Получилось так:@echo off set "var=1 2 3 4 5 6 7 8 9 10 11-18 19 20" for %%A in (%var%) do ( for /f "tokens=1,2 delims=-" %%a in ("%%A") do ( if "%%b" EQU "" echo %%a if "%%b" NEQ "" for /L %%i in (%%a,1,%%b) do echo %%i ) ) pause *строка задана сразу, для теста работает. Правда напрягает, что цикл в цикле в цикле... Но все осложняется тем, что с некоторых пор у меня добавлен предварительный анализ строки (переменной %var%) и выявление спорных номеров. И в случае наличия таковых, они попадают в переменную %attn%. И перед выполнением выводятся предупреждения для каждого из спорных пунктов. Так что пришлось дорабатывать. Пришел к такому варианту:@echo off set "var=1 2 3 199-204 223-226 4 5 6" set "attn=" for %%A in (%var%) do ( for /f "tokens=1,2 delims=-" %%G in ("%%A") do ( if "%%~H" EQU "" ( if "%%~G"=="200" call set "attn=%%attn%% 200" if "%%~G"=="204" call set "attn=%%attn%% 204" if "%%~G"=="220" call set "attn=%%attn%% 220" if "%%~G"=="225" call set "attn=%%attn%% 225" ) if "%%~H" NEQ "" for /L %%M in (%%G,1,%%H) do ( if "%%~M"=="200" call set "attn=%%attn%% 200" if "%%~M"=="204" call set "attn=%%attn%% 204" if "%%~M"=="220" call set "attn=%%attn%% 220" if "%%~M"=="225" call set "attn=%%attn%% 225" ) ) ) echo. echo YOUR CHOICE: [%var%] echo ATTN: [%attn%] echo. for %%A in (%var%) do ( for /f "tokens=1,2 delims=-" %%G in ("%%A") do ( if "%%~H" EQU "" echo %%G if "%%~H" NEQ "" for /L %%M in (%%G,1,%%H) do echo %%M ) ) echo. pause echo. exit * пришлось разбирать строку %var% дважды - сначала чтобы составить строку с проблемными пунктами (для вывода предупреждений, потом уже для выполнения пунктов. * по факту у меня конечно будет в конце не вывод на экран этих номеров, а вывод предупреждений, который прописан отдельно... и в случае согласия пользователя - выполнение пунктов.. тут упрощено для теста Тут столкнулся с проблемой, что пришлось менять букву во втором цикле, так как %%attn%% по всей видимости воспринималась как переменная цикла %%a. Пара вопросов: - Как вообще грамотные люди оформляют цикл в цикле? Я раньше просто брал в одном заглавные а в другом строчные... Но тут их три... Вроде как символы тоже годятся, пробовал с знаками $ и # - работает... Но хочется и чтобы наглядно было. - Вариант как сделал я (взял только заглавные, но удаленные друг от друга буквы для всех переменных циклов) он нормальный? Не будет проблем? Ато может на Вин10 все ОК, а например на Вин7 cmd скажет "так не годится, я ничего не понимаю"...
|
Отправлено: 03-Дек-2023 21:30
(спустя 2 часа 7 минут)
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Ander_73, Благодарю за ответ. Ну а в принципе нормально использовать в дочерних циклах так же заглавные буквы для переменных, как и в родительском цикле? (не уверен, что выбрал правильные прилагательные, заранее извиняюсь если они совсем неподходящие). Или стоит заменить и сделать везде разные варианты? В одном строчные буквы, во втором заглавные, в третьем символы? Меня в принципе устраивает то, как проименовано сейчас, просто побаиваюсь возможных "частных" случаев.
|
Ander_73
- Стаж: 7 лет 9 месяцев
- Сообщений: 3817
- Репутация:127[+] [-]
|
cartmenezz, да вариантов масса. Я например люблю переменные типа %_var% "Частные случаи" - ты прям так пишешь, будто программа будет жить какой-то своей тайной жизнью и тихонько тебе гадить
|
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
101862программа будет жить какой-то своей тайной жизнью и тихонько тебе гадить как можно на 100% доверять бездушной программе))
|
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
И снова Здравствуйте)) Нет ли случайно хитрости, как в команде CHOICE использовать в качестве choiceKeys не только цифры и буквы? Хотелось бы иметь возможность считывать нажатия кнопок: ESC, Backspace, Space, а так же стрелок ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО ... не удалось даже использовать + и -
|
Отправлено: 10-Дек-2023 02:23
(спустя 1 час 2 минуты)
Ander_73
- Стаж: 7 лет 9 месяцев
- Сообщений: 3817
- Репутация:127[+] [-]
|
bighead, dostips - forever! Но парсить ввод через пошик - фи, не спортивно. cartmenezz, я через этот метод получал также Ctrl+буква.
|
grafmontekristo
- Стаж: 1 год 1 месяц
- Сообщений: 17
- Репутация:0[+] [-]
|
Здравствуйте. Если к сможет, напишите пожалуйста батники по определению установленных в систему версий Directx-а, и Microsoft Visual C++
|
Отправлено: 14-Дек-2023 10:18
(спустя 1 час 12 минут)
bighead
- Стаж: 3 года
- Сообщений: 388
- Репутация:24[+] [-]
|
grafmontekristo, Почему сами не напишите?) По наличию файлов не сложно детектить. По уникальным кодом процесс не изучал, но думаю тоже можно. Если это для программы avalat, то ему поди не батники нужны)) По наличию файлов: DirectX (июнь 2010)%WinDir%\System32\d3dx11_43.dll RuntimePack Lite%WinDir%\System32\mfc70.dll Уникальный идентификаторы (GUID): Microsoft Visual C++ 2005-2013 Redistributable Package{d2c8df0e-f15d-4426-9e51-f13f329f9cb4};{49e969a1-2990-464d-92b5-25f6f34573c6} Microsoft Visual C++ 2015-2022 Redistributable{c2e80d68-2aa7-4ea5-afa7-dca5bf0f9b83};{3bf914a0-5787-4fe5-bedb-c0877dd757d7} Вытащено из minstall
|
grafmontekristo
- Стаж: 1 год 1 месяц
- Сообщений: 17
- Репутация:0[+] [-]
|
Спасибо!
|
cartmenezz
- Стаж: 9 лет 2 месяца
- Сообщений: 527
- Репутация:14[+] [-]
- Откуда: Калининград
|
Приветствую. Всех с Новым годом) Пытаюсь решить одну задачку: - нужно запустить фоновый процесс. - нужно иметь возможность в любой момент нажать клавишу (в идеале Enter или Esc, но можно и любую), чтобы остановить процесс и выполнить следующие команды. - так же нужно автоматически завершить процесс через 180 секунд, если пользователь ничего не нажимал (вернее, там у самой программы ограничение, она итак завершится, но надо будет как-то об этом узнать и продолжить скрипт). ... Если немного конкретики, то нужно выполнить команду утилиты adb. Но остановить выполнение можно только нажатием "Ctrl+C", после чего нужно ввести "N" (чтобы скрипт не закрылся) и нажать Enter. Сейчас у меня без всяких хитростей, примерно так:echo Идет выполнение команды. Для остановки нажмите "Ctrl+C" и т.д.... echo Остановка произойдет автоматически через 180 сек adb команда следующая команда следующая команда ... Но очень уж неудобно ... Решил переделать примерно так:for /f "tokens=2" %%A in ('tasklist /NH /FO "TABLE" /FI "IMAGENAME eq adb.exe"') do set "_pid=%%~A" start /b "" adb команда... timeout /T 180 taskkill /F /IM adb.exe /FI "PID ne %_pid%" >nul 2>&1 следующая команда следующая команда ... Надпись к сожаление свою не прописать, но я и на это был готов пойти. НО: какого-то черта, остановить таймер нажатием клавиш не удается, таймер так и тикает ... в общем, какая-то ненадежная команда ... - делать паузу через ping не вариант, в итоге приду к тому от чего уходил (надо жмякать Ctrl+C) - можно конечно просто после запуска команды прописать "pause", тогда если ничего не нажимать, а нажать по истечении 180 секунд, то команда завершения второго процесса просто отработает в пустоту, не страшно... но это потеря времени, уже не уйдешь попить чай, оставив скрипт выполняться. - наверное, лучшее к чему пришел на данный момент - утилита "wait" от Хорста Шеффера. отображения тикающего таймера к сожалению нет, но можно назначить кнопку для завершения, работает исправно. вот только есть реакции на VirusTotal (хоть и немного), так что имеются опасения - если антивирь сожрет файл, то будут проблемы. ... собственно вопрос: Можно как-нибудь без сторонних утилит реализовать точный таймер, с возможностью остановки по нажатию клавиш (одиночных, а не комбинаций)... в идеале с отображением таймера, но это не обязательно. Может как-нибудь через VBS ?
|
Страница 87 из 94
Текущее время: 24-Ноя 03:00
Часовой пояс: UTC + 3
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете прикреплять файлы к сообщениям Вы можете скачивать файлы
|
|