Некоторые умные люди изучили внутреннюю работу cmd.exe при обработке командных файлов в этом разделе вопросов и ответов на stackoverflow.com .
Чтобы избежать этого, %
он должен быть удвоен
(вышеупомянутая ссылка объясняет, что этот пакет рано отменяется парсером)
Если вы неоднократно устанавливаете и выводите переменную, содержащую a, %
вам придется делать удвоение для каждого шага, чтобы задержать расширение %
-> %%
-> %%%%
.
У связанной проблемы 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] =============================