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