-2

Я хочу создать командный файл, который при запуске выглядит и работает точно так же, как командная строка, за исключением того, что я могу что-то делать со всем, что вводит пользователь (например, регистрируя его). Как я могу это сделать?

1 ответ1

0

Следующий короткий пакетный файл будет функционировать так же, как приглашение:

@echo off
:start
set inp=
set /P inp=%cd%^> 
:: do evil stuff with %inp% here (optional)
%inp%
goto start

При следующих предостережениях: переменная inp будет видна человеку, который печатает, и если вы нажмете Control+C, он спросит вас, хотите ли вы прекратить пакетный файл.

Прохождение кода:

  • @ - скрывает следующую команду из консоли
  • echo off - скрывает все следующие команды из консоли
  • set inp= - устанавливает переменную inp в нулевую строку, потому что следующая команда оставит inp без изменений, если пользователь просто введет Enter.
  • set /P inp= - Set /P установит переменную, основанную на вводе пользователем, с подсказкой, которая будет после знака = .
  • %cd%^>  (обратите внимание на пробел в конце) - текущий каталог и символ > (по какой-то неоправданной причине ^ является escape-символом в командной строке). Это используется как подсказка для переменной inp .
  • %inp% - выполняет содержимое переменной inp .
  • goto start - возвращается к вершине.

Очевидно, вы должны спросить себя, почему это возможно без какого-либо вызова exec() или чего-то подобного. Причина в том, что каждая строка пакета "компилируется" во время выполнения - переменные подставляются в команды. Это можно увидеть, когда вы выполняете цикл for где вы используете set /A ("арифметика"), чтобы каждый раз увеличивать переменную на % - вы получаете одно и то же значение каждый раз. (Для ожидаемого поведения используйте var вместо %var% в set /A, за исключением констант.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .