Некоторые умные люди изучили внутреннюю работу cmd.exe, обрабатывающего пакетные файлы, в этом разделе вопросов и ответов на stackoverflow.com .
Чтобы избежать %
его нужно удвоить
(вышеупомянутая ссылка объясняет, что этот пакетный шаг отменен пакетным анализатором)
Если вы неоднократно устанавливаете и выводите переменную, содержащую %
вам придется делать удвоение для каждого шага, чтобы задержать расширение %
-> %%
-> %%%%
.
У связанной с этим проблемы delayedexpansion
есть два решения.
- Setlocal EnableDelayedExpansion и использование
!
вместо %
.
Это требуется, когда вы устанавливаете и используете переменную в (блок кода)
- Использование псевдо-вызова с командами set или echo для принудительного 2-го прохода оценки.
(например, для косвенной ссылки на переменную)
Примеры:
:: Q:\bar\2018\06\22\SU_1333415.cmd
@Echo off
( Echo cd c:\Users\%username%\Documents
Echo random number %random%
) >x.bat
Echo============x.bat=============
type x.bat
Echo=
( Echo cd c:\Users\%%username%%\Documents
Echo random number %%random%%
) >y.bat
Echo============y.bat=============
type y.bat
Echo=
Echo ========call echo============
Set bar=6
Set foo=bar
Call Echo foo = %foo%, %%foo%% = %%%foo%%%
Echo=
Echo =====delayed expansion !===
Setlocal EnableDelayedExpansion
Set bar=6
Set foo=bar
Echo foo = %foo%, !foo! = !%foo%!
Echo=
Echo =======(code block)==========
Set "Answer=n/a"
( Set /P "Answer=Enter a number: "
Echo 1. the Answer is [%Answer%]
Call Echo 2. the Answer is [%%Answer%%]
Echo 3. the Answer is [!Answer!]
)
Echo==============================
Образец вывода:
20:07:57 Q:\Test\2018\06\22
> SU_1333415.cmd
===========x.bat=============
cd c:\Users\LotPings\Documents
random number 5680
===========y.bat=============
cd c:\Users\%username%\Documents
random number %random%
========call echo============
foo = bar, bar = 6
=====delayed expansion !===
foo = bar, bar = 6
=======(code block)==========
Enter a number: 11
1. the Answer is [n/a]
2. the Answer is [11]
3. the Answer is [11]
=============================