我正在努力理解批处理脚本中%1
和%1%
之间的区别,但是SO中给出的解释没有意义,是错误的,或者我有完全的误解或测试脚本工作不正确。
在Windows 7上,我使用的是here给出的脚本:
@echo off
set Name=Amit
set 1=First
set 2=Second
echo My own environmental variables are:
echo Name=%Name%, 1=%1%, 2=%2%"
echo The user invoked this batch file with a parameter of %1
给出以下输出:
> tester.bat
My own environmental variables are:
Name=Amit, 1=2"
The user invoked this batch file with a parameter of .
和
> tester.bat test
My own environmental variables are:
Name=Amit, 1=test2"
我的结论:%1
和%1%
是等价的。是这样吗?
用户使用参数test调用了此批处理文件。
正如foxidrive所建议的那样:
@echo off
echo %1% abc %2%
pause
echo %1 abc %2
pause
以tester.bat aaa bbb
运行会提供第一个输出:aaa2
和第二个输出aaa abc bbb
。
答案 0 :(得分:7)
是的,%1%
语法不正确。
启动此批处理文件,以查看它如何影响脚本: file.bat aaa bbb
@echo off
echo %1% abc %2%
pause
echo %1 abc %2
pause
以下是上述控制台输出:
aaa2
Press any key to continue . . .
aaa abc bbb
Press any key to continue . . .
这是因为术语%1% abc %2%
被解析为%1
然后是一个名为% abc %
的环境变量,在上面的场景中没有定义,
加上一个2
和一个被丢弃的%
。
答案 1 :(得分:2)
不完全是。
首先你需要知道的是,%1
和%2
将首先展开,所以在这里:
echo Name=%Name%, 1=%1%, 2=%2%"
您正在回应以下变量%name%
,%1
,%, 2=%
(并且未定义变量, 2=
(甚至无法使用{{1}声明变量在其名称中))并且最后还有一个=
%
(单独)在命令提示符中会有不同的行为,并且在批处理命令提示符下它将打印echo %
但是批处理会尝试扩展它,但因为它没有包含它将被解释为..hmm什么都不会打印%
或ECHO is off.
所以最后会忽略每一个ECHO is on.
第二件事 - 目前在访问%
变量时出现的唯一方法是延迟扩展:
%1%
答案 2 :(得分:1)
%1
将始终被解析为%1
,并且可能跟随它的%
不会对其产生任何影响。 %
被忽略,或者当没有参数标识放在它前面时,可能会默默扩展为空。
echo a% b
与说
相同echo a b
这适用于脚本。