批处理 BAT文件里,到底什么时候用引号呢?

时间:2021-01-13 21:00:29
批处理 BAT文件里,到底什么时候用引号呢?

SET a=c:\abc
SET b=bcd\def
SET c="%a%\%b%" 

问题
1. 请问第3句里需要不需要引号呢? 引号到底什么时候用呢?
2. 是定义过得变量 都用%%加起来么?
3. 有没有什么书能系统的讲一下呢? 感觉网上文章很多,但是都是特别片面的一点一点。 很难掌握批处理的语法。
谢谢

26 个解决方案

#1


路径名里面有空格的时候用,有特殊符号(*/%之类)的时候用

因为空格和%之类的符号shell可能用于解析格式,引号罩起来就只当字符串了

#2


你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用

set "c=%a%\%b%"

作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。

#3


引用 2 楼 forever_young 的回复:
你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用

set "c=%a%\%b%"

作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。

谢谢 这个就是问题所在! 请问使用引号的语法是什么呢? BAIDU了很久都木有找到。唉

#4


还有可能你的变量c包含特殊字符,比如:
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 -  hh ntcmds.chm::/set.htm
引用 2 楼 forever_young 的回复:
你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用

set "c=%a%\%b%"

作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。

#5


引用 4 楼 s11ss 的回复:
还有可能你的变量c包含特殊字符,比如:
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 - hh ntcmds.chm::/set.htm


你亲测过set "c=abc&def"是正确的? 应该缺个转义符吧,正确的是set "c=abc^&def",有时候看帮助也要深刻领会哦,呵呵。

#6


引用 5 楼 forever_young 的回复:
应该缺个转义符吧

应该?嘿嘿,看来你才没有亲测过呢。。。

#7


引用 6 楼 s11ss 的回复:
引用 5 楼 forever_young 的回复:
应该缺个转义符吧
应该?嘿嘿,看来你才没有亲测过呢。。。


你所说的set "c=abc&def" 和 set c=abc&def 有何区别,我实在看不懂,能否赐教一二。

如果说 set c="abc&def" 和 set c=abc&def 有区别我还能看懂。

真心求教!

#8


hh ntcmds.chm::/set.htm 说的:
使用特殊字符 
字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前或用引号引起来(即,"StringContaining&Symbol")。如果要使用引号将含有特殊字符的字符串引起来,则该引号将被设置成环境变量值的一部分。


使用 /a 
...
如果使用逻辑 (&& ||) 或模 (%) 运算符,请使用引号将表达式字符串引起来。

ps:上面的(&& ||) 应当是写错了,应当为(& |)

范例
...
Set 将变量值设置成等号 (=) 后的内容。如果键入:
set testVar="test^1"
将得到如下结果: 
testVar="test^1"


引用 7 楼 forever_young 的回复:
引用 6 楼 s11ss 的回复:
引用 5 楼 forever_young 的回复:
应该缺个转义符吧
应该?嘿嘿,看来你才没有亲测过呢。。。


你所说的set "c=abc&amp;def" 和 set c=abc&amp;def 有何区别,我实在看不懂,能否赐教一二。

如果说 set c="abc&amp;def" 和 set c=abc&amp;def 有区别我还能看懂……

#9


set c=abc&def
在这里就相当于两条命令:
命令1:set c=abc
命令2:def

#10


系统帮助说的没错啊,帮助里的意思是有特殊命令符号需要用引号括起来,而且引号也会带入变量,就是这个意思:set c="abc&def" 和 set c=abc&def 的区别。

你说的是 set "c=abc&def" 和 set c=abc&def 有区别,在我看来这两个没任何区别,所以我犯迷糊了。

#11


正确的是:

如果字符串中有&符号,可以使用 set c="abc&def" ,但是引号会带入变量,如果不想引号被带入变量就要使用 set "c=abc^&def"。

set "c=abc&def" ---- 错误
set c=abc&def   ---- 错误
set c=abc^&def  ---- 错误

set c="abc&def" ---- 输出结果:"abc&def"

set "c=abc^&def" --- 输出结果:abc&def

#12


引用 10 楼 forever_young 的回复:
系统帮助说的没错啊,帮助里的意思是有特殊命令符号需要用引号括起来,而且引号也会带入变量,就是这个意思:set c="abc&amp;def" 和 set c=abc&amp;def 的区别。

你说的是 set "c=abc&amp;def" 和 set c=abc&amp;def 有区别,在我看来这两个没任何区别,所以我犯迷糊了。
嗯,我没仔细看,原来系统帮助里面并没有说明用引号把set之后的整个表达式引起来的这种情况(即set "c=...")

#13


引用 11 楼 forever_young 的回复:
正确的是:

如果字符串中有&amp;符号,可以使用 set c="abc&amp;def" ,但是引号会带入变量,如果不想引号被带入变量就要使用 set "c=abc^&amp;def"。

set "c=abc&amp;def" ---- 错误
set c=abc&amp;def ---- 错误
set c=abc^&amp;def ---- 错误

set c="abc&am……

兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统xp): 
set "c=abc&def" ---- c的值:abc&def
set c=abc&def ---- c的值: abc
set c=abc^&def ---- c的值:abc&def

set c="abc&def" ---- c的值:"abc&def"

set "c=abc^&def" --- c的值:abc^&def

#14


引用 13 楼 s11ss 的回复:
兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统xp):  
set "c=abc&def" ---- c的值:abc&def
set c=abc&def ---- c的值: abc
set c=abc^&def ---- c的值:abc&def

set c="abc&def" ---- c的值:"abc&def"

set "c=abc^&def" --- c的值:abc^&def


那你的XP确实很有意思,我这win7和XP下都测过。

#15


帮助中说的: 字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前(估计从英文翻译错误,应当是“之后”)。
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...

引用 14 楼 forever_young 的回复:
引用 13 楼 s11ss 的回复:
兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统xp):
set "c=abc&amp;def" ---- c的值:abc&amp;def
set c=abc&amp;def ---- c的值: abc
set c=abc^&amp;def ---- c的值:abc&amp;def

set c="abc&amp;def" ---- ……

#16


引用 14 楼 forever_young 的回复:
帮助中说的: 字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前(估计从英文翻译错误,应当是“之后”)。
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...


我三台电脑win7、XP、2003,难道你以为我会相信我的命这么苦,三个系统都有问题,有点搞笑吧,呵呵。

#17


有图有真相,期待各位达人也来试一试

批处理 BAT文件里,到底什么时候用引号呢?



批处理 BAT文件里,到底什么时候用引号呢?

#18


太强大了.哈

#19


知道了,你用的是echo %c%,我用的是set c看c的值
引用 17 楼 forever_young 的回复:
有图有真相,期待各位达人也来试一试

#20


都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。

[code=BatchFile]@echo off & setlocal enabledelayedexpansion
set c=abc^&def
echo !c!
pause[/code]

#21


引用 20 楼 s11ss 的回复:
都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。


BatchFile code
@echo off &amp; setlocal enabledelayedexpansion
set c=abc^&amp;def
echo !c!
pause


预处理可没惹祸,你开启了延迟,通过!输出的变量会当作普通字符输出了,你要是依靠开关来那个性质就变了撒。楼主可没问延迟变量的问题,不用延迟也可以,因为预处理是处理两次,那还可以这样表述

[code=BatchFile]
@echo off
set c=abc^^^&def
echo %c%
pause
[/code]

#22


我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!
引用 21 楼 forever_young 的回复:
引用 20 楼 s11ss 的回复:
都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。


BatchFile code
@echo off &amp;amp; setlocal enabledelayedexpansion
set c=abc^&amp;amp;def
echo !c!
pa……

#23


引用 22 楼 s11ss 的回复:
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!


你说的真实值指的是什么? ^符号也包含在内?

#24


比如set c=abc^&def
c的真实值就是abc&def
再比如set c=abc^^^&def
c的真实值就是abc^&def
引用 23 楼 forever_young 的回复:
引用 22 楼 s11ss 的回复:
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!


你说的真实值指的是什么? ^符号也包含在内?

#25


引用 24 楼 s11ss 的回复:
比如set c=abc^&amp;def
c的真实值就是abc&amp;def
再比如set c=abc^^^&amp;def
c的真实值就是abc^&amp;def

引用 23 楼 forever_young 的回复:
引用 22 楼 s11ss 的回复:
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!


你说的真实值指的是什么? ^符号也包含在……


拜托,我说的是在不开启延迟的情况下输出,你不会写什么代码都默认开启延迟吧,呵呵。

@echo off
set c=abc^^^&def
echo %c%
pause

你试试这个难道不是输出的abc&def

#26


Re 25L:
我知道是输出abc&def,我在之前开启延迟只是为了把它的真实值显示出来而已。

#1


路径名里面有空格的时候用,有特殊符号(*/%之类)的时候用

因为空格和%之类的符号shell可能用于解析格式,引号罩起来就只当字符串了

#2


你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用

set "c=%a%\%b%"

作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。

#3


引用 2 楼 forever_young 的回复:
你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用

set "c=%a%\%b%"

作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。

谢谢 这个就是问题所在! 请问使用引号的语法是什么呢? BAIDU了很久都木有找到。唉

#4


还有可能你的变量c包含特殊字符,比如:
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 -  hh ntcmds.chm::/set.htm
引用 2 楼 forever_young 的回复:
你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用

set "c=%a%\%b%"

作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。

#5


引用 4 楼 s11ss 的回复:
还有可能你的变量c包含特殊字符,比如:
rem 正确:
set "c=abc&amp;def"
rem 错误:(&amp;符号会把set c=abc和def分隔成两个命令)
set c=abc&amp;def
详见:开始菜单 - 运行 - hh ntcmds.chm::/set.htm


你亲测过set "c=abc&def"是正确的? 应该缺个转义符吧,正确的是set "c=abc^&def",有时候看帮助也要深刻领会哦,呵呵。

#6


引用 5 楼 forever_young 的回复:
应该缺个转义符吧

应该?嘿嘿,看来你才没有亲测过呢。。。

#7


引用 6 楼 s11ss 的回复:
引用 5 楼 forever_young 的回复:
应该缺个转义符吧
应该?嘿嘿,看来你才没有亲测过呢。。。


你所说的set "c=abc&def" 和 set c=abc&def 有何区别,我实在看不懂,能否赐教一二。

如果说 set c="abc&def" 和 set c=abc&def 有区别我还能看懂。

真心求教!

#8


hh ntcmds.chm::/set.htm 说的:
使用特殊字符 
字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前或用引号引起来(即,"StringContaining&Symbol")。如果要使用引号将含有特殊字符的字符串引起来,则该引号将被设置成环境变量值的一部分。


使用 /a 
...
如果使用逻辑 (&& ||) 或模 (%) 运算符,请使用引号将表达式字符串引起来。

ps:上面的(&& ||) 应当是写错了,应当为(& |)

范例
...
Set 将变量值设置成等号 (=) 后的内容。如果键入:
set testVar="test^1"
将得到如下结果: 
testVar="test^1"


引用 7 楼 forever_young 的回复:
引用 6 楼 s11ss 的回复:
引用 5 楼 forever_young 的回复:
应该缺个转义符吧
应该?嘿嘿,看来你才没有亲测过呢。。。


你所说的set "c=abc&amp;def" 和 set c=abc&amp;def 有何区别,我实在看不懂,能否赐教一二。

如果说 set c="abc&amp;def" 和 set c=abc&amp;def 有区别我还能看懂……

#9


set c=abc&def
在这里就相当于两条命令:
命令1:set c=abc
命令2:def

#10


系统帮助说的没错啊,帮助里的意思是有特殊命令符号需要用引号括起来,而且引号也会带入变量,就是这个意思:set c="abc&def" 和 set c=abc&def 的区别。

你说的是 set "c=abc&def" 和 set c=abc&def 有区别,在我看来这两个没任何区别,所以我犯迷糊了。

#11


正确的是:

如果字符串中有&符号,可以使用 set c="abc&def" ,但是引号会带入变量,如果不想引号被带入变量就要使用 set "c=abc^&def"。

set "c=abc&def" ---- 错误
set c=abc&def   ---- 错误
set c=abc^&def  ---- 错误

set c="abc&def" ---- 输出结果:"abc&def"

set "c=abc^&def" --- 输出结果:abc&def

#12


引用 10 楼 forever_young 的回复:
系统帮助说的没错啊,帮助里的意思是有特殊命令符号需要用引号括起来,而且引号也会带入变量,就是这个意思:set c="abc&amp;def" 和 set c=abc&amp;def 的区别。

你说的是 set "c=abc&amp;def" 和 set c=abc&amp;def 有区别,在我看来这两个没任何区别,所以我犯迷糊了。
嗯,我没仔细看,原来系统帮助里面并没有说明用引号把set之后的整个表达式引起来的这种情况(即set "c=...")

#13


引用 11 楼 forever_young 的回复:
正确的是:

如果字符串中有&amp;符号,可以使用 set c="abc&amp;def" ,但是引号会带入变量,如果不想引号被带入变量就要使用 set "c=abc^&amp;def"。

set "c=abc&amp;def" ---- 错误
set c=abc&amp;def ---- 错误
set c=abc^&amp;def ---- 错误

set c="abc&am……

兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统xp): 
set "c=abc&def" ---- c的值:abc&def
set c=abc&def ---- c的值: abc
set c=abc^&def ---- c的值:abc&def

set c="abc&def" ---- c的值:"abc&def"

set "c=abc^&def" --- c的值:abc^&def

#14


引用 13 楼 s11ss 的回复:
兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统xp):  
set "c=abc&def" ---- c的值:abc&def
set c=abc&def ---- c的值: abc
set c=abc^&def ---- c的值:abc&def

set c="abc&def" ---- c的值:"abc&def"

set "c=abc^&def" --- c的值:abc^&def


那你的XP确实很有意思,我这win7和XP下都测过。

#15


帮助中说的: 字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前(估计从英文翻译错误,应当是“之后”)。
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...

引用 14 楼 forever_young 的回复:
引用 13 楼 s11ss 的回复:
兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统xp):
set "c=abc&amp;def" ---- c的值:abc&amp;def
set c=abc&amp;def ---- c的值: abc
set c=abc^&amp;def ---- c的值:abc&amp;def

set c="abc&amp;def" ---- ……

#16


引用 14 楼 forever_young 的回复:
帮助中说的: 字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前(估计从英文翻译错误,应当是“之后”)。
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...


我三台电脑win7、XP、2003,难道你以为我会相信我的命这么苦,三个系统都有问题,有点搞笑吧,呵呵。

#17


有图有真相,期待各位达人也来试一试

批处理 BAT文件里,到底什么时候用引号呢?



批处理 BAT文件里,到底什么时候用引号呢?

#18


太强大了.哈

#19


知道了,你用的是echo %c%,我用的是set c看c的值
引用 17 楼 forever_young 的回复:
有图有真相,期待各位达人也来试一试

#20


都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。

[code=BatchFile]@echo off & setlocal enabledelayedexpansion
set c=abc^&def
echo !c!
pause[/code]

#21


引用 20 楼 s11ss 的回复:
都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。


BatchFile code
@echo off &amp; setlocal enabledelayedexpansion
set c=abc^&amp;def
echo !c!
pause


预处理可没惹祸,你开启了延迟,通过!输出的变量会当作普通字符输出了,你要是依靠开关来那个性质就变了撒。楼主可没问延迟变量的问题,不用延迟也可以,因为预处理是处理两次,那还可以这样表述

[code=BatchFile]
@echo off
set c=abc^^^&def
echo %c%
pause
[/code]

#22


我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!
引用 21 楼 forever_young 的回复:
引用 20 楼 s11ss 的回复:
都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。


BatchFile code
@echo off &amp;amp; setlocal enabledelayedexpansion
set c=abc^&amp;amp;def
echo !c!
pa……

#23


引用 22 楼 s11ss 的回复:
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!


你说的真实值指的是什么? ^符号也包含在内?

#24


比如set c=abc^&def
c的真实值就是abc&def
再比如set c=abc^^^&def
c的真实值就是abc^&def
引用 23 楼 forever_young 的回复:
引用 22 楼 s11ss 的回复:
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!


你说的真实值指的是什么? ^符号也包含在内?

#25


引用 24 楼 s11ss 的回复:
比如set c=abc^&amp;def
c的真实值就是abc&amp;def
再比如set c=abc^^^&amp;def
c的真实值就是abc^&amp;def

引用 23 楼 forever_young 的回复:
引用 22 楼 s11ss 的回复:
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!


你说的真实值指的是什么? ^符号也包含在……


拜托,我说的是在不开启延迟的情况下输出,你不会写什么代码都默认开启延迟吧,呵呵。

@echo off
set c=abc^^^&def
echo %c%
pause

你试试这个难道不是输出的abc&def

#26


Re 25L:
我知道是输出abc&def,我在之前开启延迟只是为了把它的真实值显示出来而已。