Bat set p: set | Microsoft Learn
Содержание
Пишем тетрис в bat-файле / Хабр
В комментарии к моей предыдущей статье, «Какие задачи не решаются bat-файлами?», предположили, что на bat-файлах не получится написать Doom. Насчет Дума я пока не уверен, а вот тетрис у меня получился.
Сразу оговоримся, что код, который мы будем разбирать – это proof of concept. Он имеет недоработки, но я намеренно оставил его таким, чтобы не усложнять.
Bat-файл выложен на Яндекс-диск: ссылка
Upd. На Яндекс-диске превышен лимит скачивания. Вот тот же файл на Google Drive
Геймплей
Ввод с клавиатуры
В играх определенных жанров есть необходимость проверять, какие клавиши нажаты в данный момент, и при этом не останавливаться в ожидании нажатия. В С++ это делается всего одним вызовом GetKeyboardState(). В пошаговых играх и в играх типа тетриса может пригодиться посимвольный ввод, т.е. ожидание ввода одного символа без ожидания нажатия на Enter. В C++ это тоже один вызов – _getch(). Поэтому обидно, что в bat-файле ничего подобного сделать нельзя.
Но у нас есть choice.exe. Эта утилита ожидает ввода одного из перечисленных символов и выставляет errorlevel
, равный порядковому номеру выбранного варианта. Допускаются только буквы и цифры. Есть опция таймаута. При этом требуется указать вариант по умолчанию, который выбирается по истечении таймаута.
Напрашивается решение: использовать клавиши WASD, как обычно в играх, для движения. Только движения вверх в тетрисе нет, поэтому W у нас будет поворот. При этом S, т.е. вниз, будет вариант по умолчанию, который будет срабатывать каждую секунду.
choice /C "sawd" /D s /T 1 > NUL
Вывод перенаправлен в NUL, потому что подсказку по управлению мы выведем покрасивее и сбоку от игрового поля.
И тут возникает ограничение на скорость игры. Таймаут указывается как целое количество секунд. То есть, минимальный таймаут – одна секунда. Значение 0 допустимо, но в этом случае всегда возвращается вариант по умолчанию, и никакого ввода не получается.
Кроме того, таймаут отсчитывается от запуска choice.exe. Иными словами, от предыдущего ввода, так как у нас эта команда будет в бесконечном цикле. Таким образом, если постоянно нажимать вправо-влево, то фигура вообще перестает двигаться вниз. Это первый недостаток моей реализации игры.
Представление игрового поля
В bat-файлах нет массивов. Однако, можно использовать переменные с именами, содержащими индексы. Таким образом организуются псевдо-массивы. В нашем случае это двумерный массив field_%Y%_%X%
. Y меняется от 0 до 15, причем, 0 – это верх. X – от 0 до 7. Элементы равняются либо 0 – блок свободен; либо 1 – блок занят.
Перед началом игры поле инициализируется нулями:
for /L %%a in (0,1,15) do ( for /L %%b in (0,1,7) do set field_%%a_%%b=0 )
Рендеринг игрового поля
Псевдографика позволит изобразить по две строки поля в одной строке текста. Половина ячейки символа – один блок. Так блоки получаются более-менее квадратными. Символ с кодом 223 представляет собой закрашенную верхнюю половину ячейки, 220 – нижнюю, а 219 – полностью закрашенная ячейка.
В bat-файлах нет способа указать код символа цифрами, зато можно вставить псевдографику как есть. Для интерпретатора это обычные символы, которые могут быть частью переменной или параметра команды.
Напомню, что bat-файл надо сохранять в кодировке 866. Кодировку можно изменить командой chcp, но нам это не понадобится.
Когда обе половины ячейки свободны, нужно вывести пробел. Это значит, в скрипте будет строка, оканчивающаяся пробелом. Его не видно, а он есть, и есть риск его удалить при редактировании. В кавычки его ставить нельзя. Если с командами SET и ECHO использовать кавычки, они попадают, соответственно, в переменную и на экран.
Перемещение курсора
Чтобы обновить весь экран, есть вариант его очистить командой CLS, а потом вывести всё содержимое. Но в нашем случае рендеринг идет дольше смены кадров, и изображение мигает, если очищать экран. Поэтому нужно переместить курсор в точку (1;1) и вывести новое поле поверх старого.
Для перемещения курсора нам понадобится код ANSI-терминала <ESC>[1;1H. <ESC> – это символ с кодом 27 (033 или 0x1B). Его, как и псевдографику, можно вставлять в команды как есть. Главное – найти текстовый редактор, который позволит это делать. Notepad++ подойдет. Спасибо @horror_x за подсказку.
Алгоритмы
Написание своей реализации тетриса – это упражнение не столько на графику, сколько на алгоритмы. Нужно определиться с представлением фигуры в памяти, рассчитывать поворот фигуры и ее коллизии с «ландшафтом».
Выбор фигуры
В таблице ниже представлены все фигуры тетриса
Все фигуры
Случайным образом (через переменную %RANDOM%) выбираются значения переменных figtype
(от 0 до 3) и figflip
(0 или 1). Для figtype
от 0 до 2 изменение figflip
– это зеркальное отражение относительно вертикальной оси. Фигуры с figtype
3 симметричны относительно обеих осей, поэтому для этого случая figflip
выбирает саму фигуру. Это позволяет не кодировать явно все 8 фигур. Достаточно пяти. Фигуры с figtype
<3 и figflip
=1 получаются отражением.
Представление фигур
Функция :getfigure
заполняет переменные figdefx
и figdefy
. В каждой из них 4 цифры. Каждая цифра – координата. figdefx
– это X-координаты, а figdefy
– Y. Таким образом закодированы положения 4 блоков, из которых состоит фигура. Эти переменные не меняются при повороте фигуры по ходу игры, и figflip
их тоже не меняет. Вместо этого координаты преобразуются при помощи матрицы поворота и отражения.
Матричная алгебра
:getfigure
инициализирует матрицу либо единичной матрицей, либо матрицей отражения в зависимости от figflip
. Матрица хранится в 4 переменных: mat11
, mat12
, mat21
и mat22
.
При нажатии на W происходит умножение матрицы поворота на 90° по часовой стрелке на текущую матрицу. При умножении матриц от перестановки множителей произведение меняется. Первой должна идти матрица, описывающая преобразование, выполняемое последним.
Если поворот приводит к коллизии, выполняется поворот в другую сторону аналогичным образом. В общем случае в играх так не делают, потому что накопление погрешности вычислений. Но у нас частный случай, когда все числа целые, повороты только на 90°, и элементы матрицы могут равняться только 0, 1 и -1.
Способ кодирования фигур не допускает отрицательных координат. Вся фигура занимает один квадрант и поворачивается относительно своего конца, а не центра. Это еще одна вещь, которую я не исправлял.
Применение фигуры
Функция :applyfigure
принимает 3 параметра: колбэк и координаты. Функция рассчитывает координаты каждого блока фигуры с учетом указанного смещения и матрицы и вызывает колбэк, передавая ему эти координаты.
Используются следующие колбэки:
:setblock
заполняет блок, т.е. присваивает значение 1 элементу псевдо-массиваfield_%2_%1
. Таким образом, фигура рисуется на поле;:clearblock
очищает блок. Фигура стирается с поля;:testcollision
возвращает errorlevel 1 если указанный блок заполнен или находится за границами поля. Коллизия с верхним краем тоже проверяется. Она может произойти при повороте фигуры.
Если колбэк возвращает errorlevel 1
, :applyfigure
прерывает выполнение и тоже возвращает 1.
Жизненный цикл фигуры
На метке :nextfigure
после выбора очередной фигуры эта фигура рисуется на поле в точке (3; 0). Если при этом возникает коллизия, игра заканчивается. Как вы помните, координаты блоков в определении фигуры неотрицательны, а флаг figflip
отражает фигуру относительно вертикальной оси. Таким образом, коллизия с верхним краем исключена. Коллизии с правым и левым краем тоже исключены, потому что нет таких широких фигур. Таким образом, коллизия может быть только с ландшафтом.
Если при повороте фигуры, движении вправо или влево происходит коллизия, движение или поворот не выполняется (в случае поворота вычисляется поворот обратно). Помните, что точка, вокруг которой поворачивается фигура, – это не центр фигуры. Если фигура не поворачивается, отодвиньте ее от края.
Если коллизия происходит при движении вниз, фигура становится частью ландшафта, т.е. не стирается с поля. С поля удаляются заполненные ряды, если такие есть, и выбирается следующая фигура.
За удаление заполненных рядов отвечает функция :removefulllines
. Надеюсь, там ничего сложного.
Заключение
Мы убедились, что на языке bat-файлов вполне можно писать игры. В приведенном примере кода есть недостатки, зато я надеюсь, что он прост для понимания.
На этом примере мы показали использование команды choice
для ввода с таймаутом, псевдографику и коды ANSI-терминала.
Мы продемонстрировали практическое использование псевдо-массивов, колбэков и базовых алгоритмов.
bat | BHF.GG
Help Вопрос шарящим в вирусах и коде
Нашел странную штуку завуалированную под батник .ca . Это файл формата .bat но справа от файла написано в данных, что это Пакетный файл.
Открыл нотпадом и там иероглифы, и прям стало очень интересно, что это за штука, вирус ли, что она делает и куда прописывается.
Если может кто распознать…- Blopskiy
- Thread
bat
вирус
вопрос
пакетный файл
- Replies: 17
- Forum: General questions
D
Help Bat USA
Нужен батник, чтобы удалил из моей базы всё кроме юсы. Подскажите пожалуйста, может есть у кого
- DTrumpOfficial
- Thread
bat
help
usa
- Replies: 7
- Forum: Software searching
Help Вопрос по batнику
Доброго времени суток. Буду благодарен за помощь. В кратце говоря есть вот такой батник для сортировки номеров РУ не могу понять как сделать так чтобы он еще вытаскивал номера в которых от 10 до 11 цифр а не только по первым цифрам.
Какую использовать команду чтобы он вытаскивал строки…- SkinCot
- Thread
bat
batнику
number
вопрос
по
- Replies: 0
- Forum: General questions
Help Сдох батник по отсеиванию доменов.
Почему ?
Привет всем.
Ребята появился вопрос.Первый раз с этим столкнулся.
В общем батник по отсеиванию доменов отказывается работать.Запускается .
Перетаскиваю базу как обычно делал в его и после запроса на обработку пишет END ..Типа можно закрывать
Но в итоге базу не обрабатывает…Совсем…- handalik
- Thread
bat
батник
по
реестр
- Replies: 10
- Forum: General questions
Help Поделитесь актуальным батником USA
Нужен актуальный батник USA для чека на валид, есть у кого ?
- Group
- Thread
base
bat
check
usa
поделитесь
- Replies: 6
- Forum: Software searching
Help Masscan
Господа доброго времени суток. по некоторым причинам надо погонять масскан без GUI. помогите с батником. что надо прописать в нем что бы результат был только ip:port.
а не такая шняга- partner32
- Thread
bat
gui
mass
masscan
- Replies: 1
- Forum: General questions
F
Help Вопрос про BATник, сортировка почт.
Вопрос в целом такого характера — есть BAT файл, в котором нужно реализовать сортировку на плохие почты и остальные хорошие.
Взял за основу BATник от SMARTIK, добавил свои почты как плохие и тут возникает проблема.
Например — нам нужно отсеять почты «[email protected] a@a. com [email protected]…- FriendlyFire
- Thread
bat
files
support
вопрос
вопрос про
почт
про
сортировка
сортировка почт
- Replies: 7
- Forum: General questions
K
Help Код из bat в python
Есть код bat
set /P base=»перетащите базу»
FINDSTR /L «n» %base% > doc.txt
Как сделать такой же код на питон- kesaty
- Thread
bat
python
из
код
- Replies: 6
- Forum: Help
Help Eu bat
Ребят, нужен батник для сортировки Eu базы ( чистка от мусорных доменов)
Заранее спасибо- ~AV~
- Thread
bat
eu
удаление мусорных доменов
чистка eu
- Replies: 5
- Forum: General questions
Help Помогите найти bat для склейки файлов
Всем привет. Помогите найти батник для склейки текстовиков в папке и всех вложенных в нее подпапках по названию файла. Буду очень признателен.
- Pacific_ocean
- Thread
bat
для
найти
помогите
помогите найти
склейка
склейка баз
файлов
- Replies: 2
- Forum: General questions
Help Нужна помощь с почтой (The Bat)
Проблема с почтовым сервисом.
В ночь пока ПК спят, письма не доходят и где-то теряются.
Сервак пашет 24/7 😉
Мб кто знает, что да как?)- Angel_S
- Thread
bat
bat)
нужна
нужна помощь
помощь
- Replies: 11
- Forum: General questions
A
Help што нетак с кодом bat файла?
echo off
setlocal enableextensions enabledelayedexpansion
set /P base=»Enter base filename with extension! (eg. MyBase.txt) -> »
FINDSTR /L «.id: .id;» %base% > Индия.txt
echo «Domain sort Done»
pause
del /q temp.txt
https://prnt.sc/m2g39c- Ardat
- Thread
bat
файла
- Replies: 13
- Forum: General questions
A
Help Вопрос для спецов по bat-файлам!
Здравствуйте! Есть ли какая нибудь у кого литература или ресурсы по bat-файлам для новичков? Или укажите направление куда идти в эту сторону. Заранее благодарен!!
- A47
- Thread
bat
bat-файлы
вопрос
для
по
- Replies: 1
- Forum: General questions
Sell Fifa 15-17, battlefield 4, starwars
продаю 2 акк ориджин почта отвязана, к родной доступ есть, игры на скринах
оплата киви
связь ЛС
Цена: договорная- sasho26
- Thread
bat
battlefield
fifa
- Replies: 2
- Forum: Sell
USA bat
Ребят потерял bat который был у меня. Дайте пожалуйста ссылочку на нормальный батник для отсейки юсы.
Недавно видел подобную тему но чёт не могу найти.- strogiy1300
- Thread
bat
usa
- Replies: 2
- Forum: Communication
Help BAT или как почистить…
Здравствуйте!
Подскажите пожалуйста
есть база вида почта@домен.чтото:пароль
как сделать все в виде почта:пароль
ну чтобы короче только логин остался- OxueyBro
- Thread
bat
или
как
почистить
- Replies: 0
- Forum: General questions
RDP BAT
kozerog
Для создание юзера на дедике с админ правами (Нужны админ права, запускать от админа). | Find «=»`) Do Set AdmGroup=%%J
Set…- PopCat
- Thread
bat
rdp
- Replies: 13
- Forum: Communication
Help Проблема с стимом, хелп
Захожу в строку восст.акка
И вот такая хуйня
Плохой запрос
Ваш браузер отправил запрос, который этот сервер не мог понять.
Размер поля заголовка запроса превышает лимит сервера.
С ТОРа все норм, с своего брузера не могу восстановить акк 🙁- RiverIsland
- Thread
bat
notepad
или
проблема
регулярки
хелп
- Replies: 1
- Forum: General questions
Help Хелп, регулярки с notepad или bat
Парни, есть база например
логин@mail. ru:pass2word1
Как сделать чтоб именно из паролей удалялись все цифры?- RiverIsland
- Thread
bat
notepad
или
регулярки
хелп
- Replies: 1
- Forum: General questions
Help BAT
Есть ли батник который способен склеить несколько файлов через 😕
Как пример
в .txt 1 будет слово ruka
в .txt 2 будут цифры (532532)
нужно что бы после того как батник сделал свою работу получилось так.
ruka:532532- BORIS000
- Thread
bat
- Replies: 5
- Forum: General questions
Помощь с bat
Помогите написать батник что бы он вытаскивал с такого лога определённые игры , что бы вытаскивал одну ячейку с определённой игрой с этого лога
====================
1. Account — email:pass
2. EAID — abc108988757
3. Email Status — UNKNOWN
4. Country —
5. Date created account — 2013/07/08
7…- Langers
- Thread
bat
помощь
- Replies: 3
- Forum: Communication
V
Help Подскажите конвектор bat в exe
Собственно вопрос в теме.
- Vit777
- Thread
bat
exe
подскажите
- Replies: 2
- Forum: General questions
Bat : Не убиваемый процесс майнера
1)Как сделать так . что б майнер не возможно было убить из диспетчера задач?
2) Как спрятать путь установки майнера при открытии из диспетчера задач ?
Большая просьба не флудить за зря!- vikukoll
- Thread
:
bat
не
процесс
- Replies: 9
- Forum: Communication
Помощь с bat
Можно сделать батник который будет собирать из большого текстового фала то что в кавычках?
- friwa
- Thread
bat
помошь
помощ
помощь
- Replies: 20
- Forum: Communication
Вопрос по BAT
Подскажите знающие люди. Как в батнике прописать запрос для выдергивания файла с файлообменника по
ссылке,да еще в нужную мне директорию.Без доп софта.- Gans0477
- Thread
bat
вопрос
по
- Replies: 0
- Forum: Communication
окон. Что означает /p в наборе /p?
спросил
Изменено
1 год, 2 месяца назад
Просмотрено
175 тысяч раз
Что означает /p
в наборе /p=
? Я знаю, что /
включает коммутатор, и я почти уверен, что знаю /a
для арифметика
. Я слышал множество слухов, некоторые говорят, что /p
означает prompt
, другие утверждают, что это означает print
. Единственная причина, по которой я немного сомневаюсь, что это приглашение
, заключается в том, что во многих случаях он не запрашивает приглашение, но печатает на экране, например,
Но я хочу знать следующее: Действительно ли мы знаем, что это значит?
- окна
- пакетный файл
- аббревиатура
1
Переключатель
/P
позволяет установить значение переменной в строке ввода, введенной пользователем. Отображает указанную строку promptString перед чтением строки ввода. PromptString может быть пустым.Я использовал его двумя способами... первый:
SET /P variable=Когда пакетный файл достигает этой точки (когда он оставлен пустым), он останавливается и ожидает ввода данных пользователем. Затем ввод становится переменным.
И второе:
SET /P variable=<%temp%\filename.txtБудет установлена переменная для содержимого (первая строка) файла txt. Этот метод не будет работать, если не включен
/P
. Оба тестировались на Windows 8.1 Pro, но одинаково на 7 и 10.3
Для дальнейшего использования вы можете получить справку по любой команде, используя ключ
/? Переключатель
, который должен объяснять, какие переключатели что делают.Согласно набору
/?
, форматset /p
—SET /P variable=[promptString]
, что указывает на то, что p в/p
является «подсказкой». В вашем примере он просто печатается, потому что
проходит в символе nul, который немедленно завершает подсказку, поэтому он просто действует как , как будто он печатает. Технически он по-прежнему запрашивает ввод, он просто немедленно его получает. ПРИМЕЧАНИЕ. Ответы ниже этого пункта относятся к предыдущей версии вопроса.
/L
вдля /L
генерирует L список чисел.От
пинг/?
:Использование: ping [-t] [-a] [-n количество] [-l размер] [-f] [-i TTL] [-v TOS] [-r количество] [-s количество] [[-j список хостов] | [-k список хостов]] [-w timeout] [-R] [-S srcaddr] [-4] [-6] target_name Параметры: -t Пинговать указанный хост до тех пор, пока он не будет остановлен. Чтобы посмотреть статистику и продолжить - нажмите Control-Break; Чтобы остановить - нажмите Control-C. -a Преобразовать адреса в имена хостов. -n count Количество эхо-запросов для отправки. -l размер Отправить размер буфера. -f Установить флаг «Не фрагментировать» в пакете (только для IPv4). -i Время жизни TTL. -v TOS Type Of Service (только для IPv4. Этот параметр устарел) и не влияет на поле типа службы в заголовке IP). -r count Записать маршрут для количества переходов (только для IPv4). -s count Временная метка для подсчета переходов (только для IPv4). -j список-хостов Свободный исходный маршрут по списку-хостов (только для IPv4). -k host-list Строгий исходный маршрут по списку хостов (только для IPv4). -w timeout Таймаут в миллисекундах для ожидания каждого ответа. -R Использовать заголовок маршрутизации также для проверки обратного маршрута (только для IPv6). -S srcaddr Исходный адрес для использования. -4 Принудительно использовать IPv4. -6 Принудительно использовать IPv6.1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
Пакетный файл
- Набор для программирования /p input
спросил
Изменено
8 лет, 2 месяца назадПросмотрено
36 тысяч разУ меня есть два скрипта. Первый скрипт запрашивает у пользователя некоторый ввод и вызывает другой скрипт, передавая ему ввод в качестве параметра. Второй скрипт снова запрашивает у пользователя тот же ввод.
first.bat
set /p input=Вставьте свой ввод: вызовите second.bat %input%second.bat
, если %1 == "Y" input=%1 & goto skipInput set /p input=Вставьте тот же ввод: :skipInput echo Пропущенный пользовательский вводМожно ли установить второй пользовательский ввод с первым входным значением без нажатия пользователем того же входного значения? Проблема в том, что
set /p
в second. bat нельзя пропустить, как в верхнем примере.Обновленное решение:
first.bat
set /p input=Вставьте свой ввод: эхо% ввод% | (cd path/to/file и second.bat) эхо% ввод% | (cd path/to/file и second.bat) пауза > ноль
- пакетный файл
Я не уверен на 100%, что вы пытаетесь сделать, но, возможно, это
First.bat
set /p input=Вставьте свой ввод: вызовите second.bat %input%Second.bat
если %1=="Y" установить ввод=%1Который установит переменную
input
во втором скрипте на значениеinput
в первом скрипте.Обновление
Если у вас есть доступ только к начальному пакету, который вызывает другие, попробуйте этот
@echo off set /p input=Вставьте свой ввод: эхо% ввод% | второй.летучая мышь пауза > нольПосле этого мне удалось получить приглашение во втором пакете, в котором только строка
set /p
должна быть заполнена с использованием перенаправления канала.