Einige clevere Leute untersuchten die inneren Abläufe von cmd.exe, die Batchdateien in dieser Fragen- und Antwortfrage von stackoverflow.com verarbeiten .
Um einem zu entkommen %
, muss er verdoppelt werden
(der oben genannte Link erklärt, dass dies ein Schritt ist, der vom Batch-Parser vorzeitig rückgängig gemacht wird).
Wenn Sie wiederholt eine Variable mit einem Echo setzen und wiederholen, %
müssen Sie die Verdoppelung für jeden einzelnen Schritt vornehmen, um die Erweiterung zu verzögern %
-> %%
-> %%%%
.
Das verwandte Problem delayedexpansion
hat zwei Lösungen.
- Setlocal EnableDelayedExpansion und Verwendung von
!
statt%
.
Dies ist erforderlich, wenn Sie eine Variable in einem Codeblock setzen und verwenden. - Verwendung eines Pseudoaufrufs mit Set- oder Echo-Befehlen, um einen zweiten Evaluierungsdurchgang zu erzwingen.
(um indirekt auf eine Variable zu verweisen)
Beispiele:
:: 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==============================
Beispielausgabe:
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] =============================