В этом коде есть две проблемы.
Прежде всего, чтобы ответить на ваш вопрос:
Как отобразить именно то, что я ввожу?
В пакетном случае ответ всегда сложнее, чем вы думаете . В случае echo
кавычки на самом деле не изменяют способ интерпретации %
и !
, но они также отражаются, что сейчас плохо.
Вместо этого, избегайте %
путем дублирования , &
, поставив ^
, и !
, поставив два ^
с перед ним [ref] :
echo set/a ax=%%random%% %%%% 3^&^&set aa=^^!a[%%ax%%]^^! >>%~f0
echo echo %%aa%% >>%~f0
Теперь вы можете видеть, что все отображается правильно, но повторяющийся код все равно не будет работать.
Почему?
Вторая проблема заключается в &&
: процентные переменные (%var%
) будут подставлены перед вычислением строки или группы команд (команды, заключенные в скобки).
То есть, поскольку set /a
и set
находятся в одной строке, значение %ax%
будет подставлено перед set /a
устанавливает это. Этого можно избежать, используя мощь отложенного расширения и его синтаксис !ax!
, но в этом случае это невозможно, поскольку к нему обращаются внутри доступа другой переменной.
Итак, вместо этого делайте то, что нужно &&
сделал бы иначе:
set/a ax=%random% %% 3
if %errorlevel% GTR 0 set aa=^^!a[%%ax%%]^^!
Наконец, вы получите что-то вроде:
echo set/a ax=%%random%% %%%% 3 >>%~f0
echo if %%errorlevel%% GTR 0 set aa=^^!a[%%ax%%]^^! >>%~f0
echo echo %%aa%% >>%~f0