我一直在尝试使用另一个批处理文件来制作批处理文件。
我想要制作的文件需要包含以下内容,%username%
以便它也能在其他计算机上运行。
每当我尝试执行此操作时,它都会在文件中输入我的实际用户名,这使得它无法在其他计算机上运行。有人能帮我解决我的问题吗?
这是我在批处理文件中写的内容:
Echo cd c:\Users\%username%\Documents > x.bat
但是当我打开 x.bat 时它显示:
Echo cd c:\Users\myname\Documents
我确实知道导致此问题的原因,但我找不到任何方法来解决它。
答案1
一些聪明的人检查了 cmd.exe 处理批处理文件的内部工作原理stackoverflow.com问答。
为了逃脱,%
它必须加倍
(上面提到的链接解释了这是批处理解析器早期撤消的一步)
如果您反复设置并回显包含的变量,%
则必须对所涉及的每个步骤加倍以延迟扩展%
-> %%
-> %%%%
。
相关问题delayedexpansion
有两种解决方案。
- 设置本地启用延迟扩展并使用
!
而不是%
。
在(代码块)中设置和使用变量时,这是必需的 - 使用带有 set 或 echo 命令的伪调用来强制进行第二次评估。
(例如间接引用变量)
例子:
:: 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]
=============================