如
SET a=c:\abc
SET b=bcd\def
SET c="%a%\%b%"
问题
1. 请问第3句里需要不需要引号呢? 引号到底什么时候用呢?
2. 是定义过得变量 都用%%加起来么?
3. 有没有什么书能系统的讲一下呢? 感觉网上文章很多,但是都是特别片面的一点一点。 很难掌握批处理的语法。
谢谢
26 个解决方案
#1
路径名里面有空格的时候用,有特殊符号(*/%之类)的时候用
因为空格和%之类的符号shell可能用于解析格式,引号罩起来就只当字符串了
因为空格和%之类的符号shell可能用于解析格式,引号罩起来就只当字符串了
#2
你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用
set "c=%a%\%b%"
作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。
set "c=%a%\%b%"
作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。
#3
谢谢 这个就是问题所在! 请问使用引号的语法是什么呢? BAIDU了很久都木有找到。唉
#4
还有可能你的变量c包含特殊字符,比如:
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 - hh ntcmds.chm::/set.htm
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 - hh ntcmds.chm::/set.htm
#5
你亲测过set "c=abc&def"是正确的? 应该缺个转义符吧,正确的是set "c=abc^&def",有时候看帮助也要深刻领会哦,呵呵。
#6
应该?嘿嘿,看来你才没有亲测过呢。。。
#7
你所说的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"
使用特殊字符
字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前或用引号引起来(即,"StringContaining&Symbol")。如果要使用引号将含有特殊字符的字符串引起来,则该引号将被设置成环境变量值的一部分。
使用 /a
...
如果使用逻辑 (&& ||) 或模 (%) 运算符,请使用引号将表达式字符串引起来。
ps:上面的(&& ||) 应当是写错了,应当为(& |)
范例
...
Set 将变量值设置成等号 (=) 后的内容。如果键入:
set testVar="test^1"
将得到如下结果:
testVar="test^1"
#9
set c=abc&def
在这里就相当于两条命令:
命令1:set c=abc
命令2:def
在这里就相当于两条命令:
命令1:set c=abc
命令2:def
#10
系统帮助说的没错啊,帮助里的意思是有特殊命令符号需要用引号括起来,而且引号也会带入变量,就是这个意思:set c="abc&def" 和 set c=abc&def 的区别。
你说的是 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
如果字符串中有&符号,可以使用 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
嗯,我没仔细看,原来系统帮助里面并没有说明用引号把set之后的整个表达式引起来的这种情况(即set "c=...")
#13
兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统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
那你的XP确实很有意思,我这win7和XP下都测过。
#15
帮助中说的: 字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前(估计从英文翻译错误,应当是“之后”)。
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...
#16
我三台电脑win7、XP、2003,难道你以为我会相信我的命这么苦,三个系统都有问题,有点搞笑吧,呵呵。
#17
有图有真相,期待各位达人也来试一试
#18
太强大了.哈
#19
知道了,你用的是echo %c%,我用的是set c看c的值
#20
都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。
[code=BatchFile]@echo off & setlocal enabledelayedexpansion
set c=abc^&def
echo !c!
pause[/code]
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。
[code=BatchFile]@echo off & setlocal enabledelayedexpansion
set c=abc^&def
echo !c!
pause[/code]
#21
预处理可没惹祸,你开启了延迟,通过!输出的变量会当作普通字符输出了,你要是依靠开关来那个性质就变了撒。楼主可没问延迟变量的问题,不用延迟也可以,因为预处理是处理两次,那还可以这样表述
[code=BatchFile]
@echo off
set c=abc^^^&def
echo %c%
pause
[/code]
#22
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!
#23
你说的真实值指的是什么? ^符号也包含在内?
#24
比如set c=abc^&def
c的真实值就是abc&def
再比如set c=abc^^^&def
c的真实值就是abc^&def
c的真实值就是abc&def
再比如set c=abc^^^&def
c的真实值就是abc^&def
#25
拜托,我说的是在不开启延迟的情况下输出,你不会写什么代码都默认开启延迟吧,呵呵。
@echo off
set c=abc^^^&def
echo %c%
pause
你试试这个难道不是输出的abc&def
#26
Re 25L:
我知道是输出abc&def,我在之前开启延迟只是为了把它的真实值显示出来而已。
我知道是输出abc&def,我在之前开启延迟只是为了把它的真实值显示出来而已。
#1
路径名里面有空格的时候用,有特殊符号(*/%之类)的时候用
因为空格和%之类的符号shell可能用于解析格式,引号罩起来就只当字符串了
因为空格和%之类的符号shell可能用于解析格式,引号罩起来就只当字符串了
#2
你第三句的引号啥作用都不起,只是会被当作字符来处理,应该这么用
set "c=%a%\%b%"
作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。
set "c=%a%\%b%"
作用是不想有额外的符号或者字符破坏了变量的完整性,比如后面带入了空格等计划外的字符到变量里去。
#3
谢谢 这个就是问题所在! 请问使用引号的语法是什么呢? BAIDU了很久都木有找到。唉
#4
还有可能你的变量c包含特殊字符,比如:
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 - hh ntcmds.chm::/set.htm
rem 正确:
set "c=abc&def"
rem 错误:(&符号会把set c=abc和def分隔成两个命令)
set c=abc&def
详见:开始菜单 - 运行 - hh ntcmds.chm::/set.htm
#5
你亲测过set "c=abc&def"是正确的? 应该缺个转义符吧,正确的是set "c=abc^&def",有时候看帮助也要深刻领会哦,呵呵。
#6
应该?嘿嘿,看来你才没有亲测过呢。。。
#7
你所说的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"
使用特殊字符
字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前或用引号引起来(即,"StringContaining&Symbol")。如果要使用引号将含有特殊字符的字符串引起来,则该引号将被设置成环境变量值的一部分。
使用 /a
...
如果使用逻辑 (&& ||) 或模 (%) 运算符,请使用引号将表达式字符串引起来。
ps:上面的(&& ||) 应当是写错了,应当为(& |)
范例
...
Set 将变量值设置成等号 (=) 后的内容。如果键入:
set testVar="test^1"
将得到如下结果:
testVar="test^1"
#9
set c=abc&def
在这里就相当于两条命令:
命令1:set c=abc
命令2:def
在这里就相当于两条命令:
命令1:set c=abc
命令2:def
#10
系统帮助说的没错啊,帮助里的意思是有特殊命令符号需要用引号括起来,而且引号也会带入变量,就是这个意思:set c="abc&def" 和 set c=abc&def 的区别。
你说的是 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
如果字符串中有&符号,可以使用 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
嗯,我没仔细看,原来系统帮助里面并没有说明用引号把set之后的整个表达式引起来的这种情况(即set "c=...")
#13
兄弟,你喝酒喝蒙了吧....
是这样的(我测试过了,本人系统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
那你的XP确实很有意思,我这win7和XP下都测过。
#15
帮助中说的: 字符 < > | & ^ 是特殊命令外壳字符,在字符串中使用时必须位于 escape 字符 (^) 之前(估计从英文翻译错误,应当是“之后”)。
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...
所以:
set c=abc^&def ---- c的值为abc&def
我的测试与这个是相符的,呵呵,是你的系统有问题...
#16
我三台电脑win7、XP、2003,难道你以为我会相信我的命这么苦,三个系统都有问题,有点搞笑吧,呵呵。
#17
有图有真相,期待各位达人也来试一试
#18
太强大了.哈
#19
知道了,你用的是echo %c%,我用的是set c看c的值
#20
都是预处理惹的祸...
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。
[code=BatchFile]@echo off & setlocal enabledelayedexpansion
set c=abc^&def
echo !c!
pause[/code]
如果用了setlocal enabledelayedexpansion
再echo !c!就会输出c的实际值。
[code=BatchFile]@echo off & setlocal enabledelayedexpansion
set c=abc^&def
echo !c!
pause[/code]
#21
预处理可没惹祸,你开启了延迟,通过!输出的变量会当作普通字符输出了,你要是依靠开关来那个性质就变了撒。楼主可没问延迟变量的问题,不用延迟也可以,因为预处理是处理两次,那还可以这样表述
[code=BatchFile]
@echo off
set c=abc^^^&def
echo %c%
pause
[/code]
#22
我知道要再把^转义啊!可是你用%c%显示出来的值并不是变量c的真实值啊!
#23
你说的真实值指的是什么? ^符号也包含在内?
#24
比如set c=abc^&def
c的真实值就是abc&def
再比如set c=abc^^^&def
c的真实值就是abc^&def
c的真实值就是abc&def
再比如set c=abc^^^&def
c的真实值就是abc^&def
#25
拜托,我说的是在不开启延迟的情况下输出,你不会写什么代码都默认开启延迟吧,呵呵。
@echo off
set c=abc^^^&def
echo %c%
pause
你试试这个难道不是输出的abc&def
#26
Re 25L:
我知道是输出abc&def,我在之前开启延迟只是为了把它的真实值显示出来而已。
我知道是输出abc&def,我在之前开启延迟只是为了把它的真实值显示出来而已。