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

  1. Help Вопрос шарящим в вирусах и коде

    Нашел странную штуку завуалированную под батник .ca . Это файл формата .bat но справа от файла написано в данных, что это Пакетный файл.
    Открыл нотпадом и там иероглифы, и прям стало очень интересно, что это за штука, вирус ли, что она делает и куда прописывается.
    Если может кто распознать…

    • Blopskiy
    • Thread
    • bat

      вирус

      вопрос

      пакетный файл

    • Replies: 17
    • Forum: General questions
  2. D

    Help Bat USA

    Нужен батник, чтобы удалил из моей базы всё кроме юсы. Подскажите пожалуйста, может есть у кого

    • DTrumpOfficial
    • Thread
    • bat

      help

      usa

    • Replies: 7
    • Forum: Software searching
  3. Help Вопрос по batнику

    Доброго времени суток. Буду благодарен за помощь. В кратце говоря есть вот такой батник для сортировки номеров РУ не могу понять как сделать так чтобы он еще вытаскивал номера в которых от 10 до 11 цифр а не только по первым цифрам.
    Какую использовать команду чтобы он вытаскивал строки…

    • SkinCot
    • Thread
    • bat

      batнику

      number

      вопрос

      по

    • Replies: 0
    • Forum: General questions
  4. Help Сдох батник по отсеиванию доменов.

    Почему ?

    Привет всем.
    Ребята появился вопрос.Первый раз с этим столкнулся.
    В общем батник по отсеиванию доменов отказывается работать.Запускается .
    Перетаскиваю базу как обычно делал в его и после запроса на обработку пишет END ..Типа можно закрывать
    Но в итоге базу не обрабатывает…Совсем…

    • handalik
    • Thread
    • bat

      батник

      по

      реестр

    • Replies: 10
    • Forum: General questions
  5. Help Поделитесь актуальным батником USA

    Нужен актуальный батник USA для чека на валид, есть у кого ?

    • Group
    • Thread
    • base

      bat

      check

      usa

      поделитесь

    • Replies: 6
    • Forum: Software searching
  6. Help Masscan

    Господа доброго времени суток. по некоторым причинам надо погонять масскан без GUI. помогите с батником. что надо прописать в нем что бы результат был только ip:port.
    а не такая шняга

    • partner32
    • Thread
    • bat

      gui

      mass

      masscan

    • Replies: 1
    • Forum: General questions
  7. F

    Help Вопрос про BATник, сортировка почт.

    Вопрос в целом такого характера — есть BAT файл, в котором нужно реализовать сортировку на плохие почты и остальные хорошие.
    Взял за основу BATник от SMARTIK, добавил свои почты как плохие и тут возникает проблема.
    Например — нам нужно отсеять почты «[email protected] a@a. com [email protected]

    • FriendlyFire
    • Thread
    • bat

      files

      support

      вопрос

      вопрос про

      почт

      про

      сортировка

      сортировка почт

    • Replies: 7
    • Forum: General questions
  8. K

    Help Код из bat в python

    Есть код bat
    set /P base=»перетащите базу»
    FINDSTR /L «n» %base% > doc.txt
    Как сделать такой же код на питон

    • kesaty
    • Thread
    • bat

      python

      из

      код

    • Replies: 6
    • Forum: Help
  9. Help Eu bat

    Ребят, нужен батник для сортировки Eu базы ( чистка от мусорных доменов)
    Заранее спасибо

    • ~AV~
    • Thread
    • bat

      eu

      удаление мусорных доменов

      чистка eu

    • Replies: 5
    • Forum: General questions
  10. Help Помогите найти bat для склейки файлов

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

    • Pacific_ocean
    • Thread
    • bat

      для

      найти

      помогите

      помогите найти

      склейка

      склейка баз

      файлов

    • Replies: 2
    • Forum: General questions
  11. Help Нужна помощь с почтой (The Bat)

    Проблема с почтовым сервисом.
    В ночь пока ПК спят, письма не доходят и где-то теряются.
    Сервак пашет 24/7 😉
    Мб кто знает, что да как?)

    • Angel_S
    • Thread
    • bat

      bat)

      нужна

      нужна помощь

      помощь

    • Replies: 11
    • Forum: General questions
  12. 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
  13. A

    Help Вопрос для спецов по bat-файлам!

    Здравствуйте! Есть ли какая нибудь у кого литература или ресурсы по bat-файлам для новичков? Или укажите направление куда идти в эту сторону. Заранее благодарен!!

    • A47
    • Thread
    • bat

      bat-файлы

      вопрос

      для

      по

    • Replies: 1
    • Forum: General questions
  14. Sell Fifa 15-17, battlefield 4, starwars

    продаю 2 акк ориджин почта отвязана, к родной доступ есть, игры на скринах
    оплата киви
    связь ЛС
    Цена: договорная

    • sasho26
    • Thread
    • bat

      battlefield

      fifa

    • Replies: 2
    • Forum: Sell
  15. USA bat

    Ребят потерял bat который был у меня. Дайте пожалуйста ссылочку на нормальный батник для отсейки юсы.
    Недавно видел подобную тему но чёт не могу найти.

    • strogiy1300
    • Thread
    • bat

      usa

    • Replies: 2
    • Forum: Communication
  16. Help BAT или как почистить…

    Здравствуйте!
    Подскажите пожалуйста
    есть база вида почта@домен.чтото:пароль
    как сделать все в виде почта:пароль
    ну чтобы короче только логин остался

    • OxueyBro
    • Thread
    • bat

      или

      как

      почистить

    • Replies: 0
    • Forum: General questions
  17. RDP BAT

    kozerog
    Для создание юзера на дедике с админ правами (Нужны админ права, запускать от админа). | Find «=»`) Do Set AdmGroup=%%J
    Set…

    • PopCat
    • Thread
    • bat

      rdp

    • Replies: 13
    • Forum: Communication
  18. Help Проблема с стимом, хелп

    Захожу в строку восст.акка
    И вот такая хуйня
    Плохой запрос
    Ваш браузер отправил запрос, который этот сервер не мог понять.
    Размер поля заголовка запроса превышает лимит сервера.
    С ТОРа все норм, с своего брузера не могу восстановить акк 🙁

    • RiverIsland
    • Thread
    • bat

      notepad

      или

      проблема

      регулярки

      хелп

    • Replies: 1
    • Forum: General questions
  19. Help Хелп, регулярки с notepad или bat

    Парни, есть база например
    логин@mail. ru:pass2word1
    Как сделать чтоб именно из паролей удалялись все цифры?

    • RiverIsland
    • Thread
    • bat

      notepad

      или

      регулярки

      хелп

    • Replies: 1
    • Forum: General questions
  20. Help BAT

    Есть ли батник который способен склеить несколько файлов через 😕
    Как пример
    в .txt 1 будет слово ruka
    в .txt 2 будут цифры (532532)
    нужно что бы после того как батник сделал свою работу получилось так.
    ruka:532532

    • BORIS000
    • Thread
    • bat

    • Replies: 5
    • Forum: General questions
  21. Помощь с 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
  22. V

    Help Подскажите конвектор bat в exe

    Собственно вопрос в теме.

    • Vit777
    • Thread
    • bat

      exe

      подскажите

    • Replies: 2
    • Forum: General questions
  23. Bat : Не убиваемый процесс майнера

    1)Как сделать так . что б майнер не возможно было убить из диспетчера задач?
    2) Как спрятать путь установки майнера при открытии из диспетчера задач ?
    Большая просьба не флудить за зря!

    • vikukoll
    • Thread
    • :

      bat

      не

      процесс

    • Replies: 9
    • Forum: Communication
  24. Помощь с bat

    Можно сделать батник который будет собирать из большого текстового фала то что в кавычках?

    • friwa
    • Thread
    • bat

      помошь

      помощ

      помощь

    • Replies: 20
    • Forum: Communication
  25. Вопрос по 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 должна быть заполнена с использованием перенаправления канала.