Algumas pessoas inteligentes examinaram o funcionamento interno dos arquivos em lote de processamento do cmd.exe neste stackoverflow.com Perguntas e respostas
Para escapar de um %
, ele precisa ser duplicado.
(o link acima mencionado explica que esta é uma etapa inicial desfeita pelo analisador de lote)
Se você definir e repetir repetidamente uma variável contendo %
, será necessário duplicar todas as etapas envolvidas para atrasar a expansão %
- > %%
- > %%%%
.
O problema relacionado delayedexpansion
tem duas soluções.
-
SetLocal EnableDelayedExpansion e uso de
!
em vez de%
.
Isso é necessário quando você define e usa uma variável em um (bloco de código) - Uso de uma pseudo chamada com comandos set ou echo
forçar um segundo passe de avaliação.
(para referenciar indiretamente uma variável, por exemplo)
Exemplos:
:: Q:\bar18\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==============================
Exemplo de saída:
20:07:57 Q:\Test18
> 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]
=============================