如何使用批处理文件创建另一个包含 %username% 的批处理文件

如何使用批处理文件创建另一个包含 %username% 的批处理文件

我一直在尝试使用另一个批处理文件来制作批处理文件。
我想要制作的文件需要包含以下内容,%username%以便它也能在其他计算机上运行。
每当我尝试执行此操作时,它都会在文件中输入我的实际用户名,这使得它无法在其他计算机上运行。有人能帮我解决我的问题吗?

这是我在批处理文件中写的内容:

Echo cd c:\Users\%username%\Documents > x.bat

但是当我打开 x.bat 时它显示:

Echo cd c:\Users\myname\Documents

我确实知道导致此问题的原因,但我找不到任何方法来解决它。

答案1

一些聪明的人检查了 cmd.exe 处理批处理文件的内部工作原理stackoverflow.com问答。

为了逃脱,%它必须加倍
(上面提到的链接解释了这是批处理解析器早期撤消的一步)

如果您反复设置并回显包含的变量,%则必须对所涉及的每个步骤加倍以延迟扩展%-> %%-> %%%%

相关问题delayedexpansion有两种解决方案。

  1. 设置本地启用延迟扩展并使用!而不是%
    在(代码块)中设置和使用变量时,这是必需的
  2. 使用带有 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]
=============================

相关内容