据我了解 OP,Aacini 和 stackoverflow 的答案是错误的。
(Aacini 的)延迟扩展解决方案只能num
在开始批处理之前定义,否则%mnm%
永远不会扩展。
C:\>set "num="
C:\>myBatch.bat user%num%
结果到输出
user%num%
另一个解决方案(stackoverflow)工作得更好一些,但在定义时失败num
我加了一秒钟set num=2
来演示它
@ECHO off
SET param=%1
SET num=1
CALL SET x=%param%
ECHO %x%
set num=2
CALL SET x=%param%
ECHO %x%
调用它两次显示问题
C:\>myBatch user%num%
user1
user2
C:\>myBatch user%num%
user2
user2
在第二次运行中,你得到了2
两次,因为结果在批处理启动时是固定的。
回显 的内容%1
以查看格式字符串是否真的存在或是否%num%
已经扩展是一个好主意。
据我了解 OP(我可能不明白!),问题是关于使用占位符,
但这对于百分比来说很棘手,因为它只适用于命令行(而不是来自另一批)而且它只如果在那一刻未定义变量,则有效。
因为,如果定义了变量,那么%num%
将立即扩展并且内容%1
是user2
和非user%num%
(假设 num=2)。
它有时起作用只是命令行解析器的副作用,因为它不会删除未定义的变量(如在批处理文件中),而是未定义的变量扩展不会以任何方式改变。
echo "%thisIsUndefined%" - from cmd-line this outputs `"%thisIsUndefined%"`
echo "%thisIsUndefined%" - from a batch file this outputs `""`
但作为副作用,不存在在命令行上下文中转义百分号的方法。
仅存在一种用于伪转义的解决方法。
mybatch user%num^%
它并没有真正逃脱百分比,但大多数情况下不会存在名为 的变量num^
。
然后stackoverlow的解决方案将起作用,具有:
myBatch user%num^%
但我更喜欢 Aacini 提到的延迟扩张。
然后你会用感叹号而不是百分比来调用批处理,通常这很好用,因为默认情况下禁用延迟扩展。
myBatch user!num!
批次本身看起来像这样
@echo off
set "param=%1"
Setlocal EnableDelayedExpansion
set num=1
echo %param%
set num=2
echo %param%