Windows批处理脚本中%1和%1%之间有区别吗?

时间:2014-07-19 06:28:57

标签: windows batch-file

我正在努力理解批处理脚本中%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

3 个答案:

答案 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

这适用于脚本。