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

    bighead
  • 29484
  • Стаж: 2 года 5 месяцев
  • Сообщений: 371
  • Репутация:22

    [+] [-]
kipjatok001, не подскажите мне батник, а напишите мне пожалуйста батник или погуглите за меня батник ag
Копируются папки обычно командами copy , xcopy , robocopy
Смотрите справки по этим командам, выбирайте подходящую. Не ленитесь забить в гугл свою хотелку, скорее всего уже кто-то спрашивал и ему уже подсказывали батник.
из примеров:
xcopy /i/h/r/k/y/e "откуда\*" "куда\"
мануал по xcopy

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация: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 скажет "так не годится, я ничего не понимаю"...

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

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

    [+] [-]
cartmenezz, ну, можно применить EnableDelayedExpansion
И ты прав, надо избегать коллизий типа
for %%a in () do call set %%a%%
потому что call set - это хак, а парсер прямолинеен ab

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, aa
Благодарю за ответ.
Ну а в принципе нормально использовать в дочерних циклах так же заглавные буквы для переменных, как и в родительском цикле? (не уверен, что выбрал правильные прилагательные, заранее извиняюсь если они совсем неподходящие).
Или стоит заменить и сделать везде разные варианты? В одном строчные буквы, во втором заглавные, в третьем символы?
Меня в принципе устраивает то, как проименовано сейчас, просто побаиваюсь возможных "частных" случаев.

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

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

    [+] [-]
cartmenezz, да вариантов масса. Я например люблю переменные типа %_var%
"Частные случаи" - ты прям так пишешь, будто программа будет жить какой-то своей тайной жизнью и тихонько тебе гадить af

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
101862программа будет жить какой-то своей тайной жизнью и тихонько тебе гадить
как можно на 100% доверять бездушной программе))

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
И снова Здравствуйте))
Нет ли случайно хитрости, как в команде CHOICE использовать в качестве choiceKeys не только цифры и буквы?
Хотелось бы иметь возможность считывать нажатия кнопок: ESC, Backspace, Space, а так же стрелок ВВЕРХ, ВНИЗ, ВЛЕВО, ВПРАВО
...
не удалось даже использовать + и -

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

    bighead
  • 29484
  • Стаж: 2 года 5 месяцев
  • Сообщений: 371
  • Репутация:22

    [+] [-]
cartmenezz, aa почитайте тут и тут, и ещё здесь
Возможно что-то покажется полезным ab

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
bighead, aa
Премного благодарен)
+++
пока освоил только вот это:
:GetKey
set "key="
for /F "usebackq delims=" %%L in (`xcopy /L /w "%~f0" "%~f0" 2^>NUL`) do (
  if not defined key set "key=%%L"
)
set "key=%key:~-1%"
exit /b
ESC и кнопки Вверх-Вниз-Влево-Вправо - увы нет, а вот практически все остальное определяется (получается использовать: - + TAB SPACE BACKSPACE ENTER).
Завтра на свежую голову еще надо будет попытаться вкурить, как это работает, пока не стал вникать, только опробовал (уж очень спасть хочется).
...
А вот с первыми двумя примерами не уверен что разберусь даже на свежую голову, разве что через пару-тройку лет, когда будет побольше опыта))

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

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

    [+] [-]
bighead, dostips - forever! Но парсить ввод через пошик - фи, не спортивно.
cartmenezz, я через этот метод получал также Ctrl+буква.

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация:14

    [+] [-]
  • Откуда: Калининград
Ander_73, aa
101922я через этот метод получал также Ctrl+буква.
Понял, благодарю. Метод однозначно сохраню в копилку.
Вообще, я пытаюсь сделать что-то типа навигации по Android, поэтому в первую очередь хотелось заполучить стрелки.
Но и геймерский вариант ASWD, в принципе, удобен. А с добавлением space, backspace и enter уже прям неплохо получается))

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

    grafmontekristo
  • 33957
  • Стаж: 7 месяцев 3 дня
  • Сообщений: 18
  • Репутация:0

    [+] [-]
Здравствуйте. Если к сможет, напишите пожалуйста батники по определению установленных в систему версий Directx-а, и Microsoft Visual C++

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

    bighead
  • 29484
  • Стаж: 2 года 5 месяцев
  • Сообщений: 371
  • Репутация:22

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

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

    grafmontekristo
  • 33957
  • Стаж: 7 месяцев 3 дня
  • Сообщений: 18
  • Репутация:0

    [+] [-]
101978По наличию файлов:
Спасибо! ay

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

    cartmenezz
  • 1384
  • Стаж: 8 лет 7 месяцев
  • Сообщений: 526
  • Репутация: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 из 89


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

Текущее время: 28-Апр 13:28

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


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