Я хочу создать командный файл, который при запуске выглядит и работает точно так же, как командная строка, за исключением того, что я могу что-то делать со всем, что вводит пользователь (например, регистрируя его). Как я могу это сделать?
1 ответ
Следующий короткий пакетный файл будет функционировать так же, как приглашение:
@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, за исключением констант.)