@:: 使用 CSDN Cobol 格式化风格。
@:: *. 百分号 (%)
@:: (1) % 作为变量引导符,有几种用途:
在命令行窗口中,用 1 个 % 引号变量;
在批处理文件中,用 2 个 % 引号变量。
[1] 两个 % 夹着一个变量名称,表示取(扩展)这个变量的值。
举例:
set var=123
echo %var%
[2] 字段替换
{1} set var=%var:str1=str2%
会扩展 var 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 如果以星号 (*) 打头,则表示匹配 var 扩展结果的前缀。
[3] 字段截取
为变量的扩展结果字符串指定子字符串。
语法:
set <variable>=[%variable:~[<begin>][,<length>]%]
set <variable>=[%variable:~[<begin>][,<end>]%]
set 的内部逻辑与 C++ STL Verctor 容器的迭代器一致,遵循左闭右开的原则。
set 从扩展串中提取 [begin, end) 或 [begin, begin+length) 范围内的子串。
begin, end, length 都是可选项。
begin 必须为整数,可以是负数。end 必须是负整数。length 必须是正整数。
数值是正数时,可以省略数字前面的加号 (+)。
begin 表示偏移量,为子串在扩展串中的开头字符位置。
end 表示偏移量,为子串在扩展串中的结尾字符位置加 1 。即 end 位置总是不提取字符的。
length 表示子串的长度。
begin 若不提供,则默认值为 0,指向扩展串的第一个字符。
end 若不提供,则默认值为扩展字符串的最后一个字符的下一个位置。
length 若不提供,则默认值为扩展字符串的剩余长度。
end,length 若不提供,或可能超出扩展串的范围,则表示提取扩展字符串的剩余部分。
举例:
{1} set str=0123456789X987654321
偏移量: 0123456789X9876543210
↑ ↑
begin end
正偏移量从左向右偏移,默认从左 0 起算。 原串中左边第 1 个字符。
负偏移量从右向左偏移,默认从右 0 起算。 原串中右边第 1 个字符的后一个字符位置。
总长度: str.length = 10+1+9 = 20
以下例子,请对照例 {1} 的偏移量序列。
{2} set var=%str:~10,5%
var: X9876
begin 偏移量为 10,从左向右数第 10+1=11 个字符开始提取,这里是 X 。 因为左边起第 1 个字符的偏移量是 0 。
length = 5 为正数,表示提取的子串长度,提取 5 个字符。
{3} set var=%str:~10,-5%
var: X9876
begin 偏移量为 10,从左向右数第 10+1=11 个字符开始提取,这里是 X 。
end 的偏移量为 -5,从右向左数第 5 个字符结束提取。 注意是提取到 end 位置的前一个字符,即 6 。
{4} set var=%str:~-10,-5%
var: X9876
begin 偏移量为 -10,从右向左数第 10 个字符开始提取,这里是 X 。 因为右边起第 1 个字符的偏移量是 1 。
end 的偏移量为 -5,从右向左数第 5 个字符结束提取。 注意是提取到 end 位置的前一个字符,即 6 。
{5} set var=%str:~-10,5%
var: X9876
begin 偏移量为 -10,从右向左数第 10 个字符开始提取,这里是 X 。
length = 5 为正数,表示提取的子串长度,提取 5 个字符。
{6} set var=%str:~10%
var: X987654321
begin 偏移量为 10,从左向右数第 10+1=11 个字符开始提取,这里是 X 。
end,length 不提供,则会提取 str 变量的剩余字符。
{7} set var=%str:~-10%
var: X987654321
begin 偏移量为 -10,从右向左数第 10 个字符开始提取,这里是 X 。
end,length 不提供,则会提取 str 变量的剩余字符。
{8} set var=%str:~,5%
var: 01234
begin 不提供,则偏移量默认值为 0,从 str 的第 1 个字符开始提取。
length = 5 为正数,表示提取的子串长度,提取 5 个字符。
{9} set var=%str:~,-5%
var: 0123456789X9876
begin 不提供,则偏移量默认值为 0,从扩展串的第 1 个字符开始提取。
end 的偏移量为 -5,从右向左数第 5 个字符结束提取。 注意是提取到 end 位置的前一个字符,即 6 。
{10} set var=%str:~%
var: 0123456789X987654321
begin,end,length 都不选,则提取整个扩展串 str 。
{11} set var=%str:~10,500%
var: X987654321
length >= str.length, 超出扩展串的范围,则表示提取扩展字符串的剩余部分。
{12} set var=%str:~-21,5%
var: 01234
begin < str.begin, 则从左向右数第 1 个字符开始提取。
{13} set var=%str:~20,1%
var: null
begin >= str.length,提取失败。 这时 var 被设置为 null (未定义)。
{14} set var=%str:~10,-10%
set var=%str:~15,-10%
var: null
begin >= end,提取失败。 这时 var 被设置为 null (未定义)。
{15} set var=%str:~0,0%
set var=%str:~+0,-0%
set var=%str:~-0,+0%
set var=%str:~-0,-0%
var: null
begin,end,length 均为 0,提取失败。 这时 var 被设置为 null (未定义)。
{16} set var=%str:~,%
var: null
begin,end,length 都不提供,存在逗号(,) ,提取失败。 这时 var 被设置为 null (未定义)。
{17} set var=%str:10,5%
var: %str:10,5%
~ 不提供,则表达式无效,这时 var 为字面常量。
[3] %0, %1, %2 ... %9
表示取传入脚本或函数的参数,数字 n 为 1 到 9, 表示第 n 个参数。第 0 个参数为整个命令行调用语句。
%*
表示取传入脚本或函数的所有参数。不包括执行命令名称。
[4] for 循环中引用枚举变量
举例:
:: 1.bat 文件中
for /f "delims=" %%i in ('dir ') do set val=!val! %%i
echo val=%val%
执行 “1.bat”,将一个命令(dir)的返回结果传给一个变量(val)
[5] 扩充变量 (Variable substitution)
批处理参数 (%n) 的替代已被增强。您可以使用以下语法:
%~1 - 扩充 %1,然后删除引号 (")
%~f1 - 将 %1 扩充到一个完全合格的路径名
%~d1 - 仅将 %1 扩充到一个驱动器号
%~p1 - 仅将 %1 扩充到一个路径
%~n1 - 仅将 %1 扩充到一个文件名
%~x1 - 仅将 %1 扩充到一个文件扩展名
%~s1 - 扩充的路径指含有短名
%~a1 - 将 %1 扩充到文件属性
%~t1 - 将 %1 扩充到文件的日期/时间
%~z1 - 将 %1 扩充到文件的大小
%~$PATH:1 - 查找列在 PATH 环境变量的目录,并将 %1 扩充到找到的第一个完全合格的名称。
如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串。
可以组合修定符来取得多重结果:
%~dp1 - 只将 %1 扩展到驱动器号和路径
%~nx1 - 只将 %1 扩展到文件名和扩展名
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径。
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
在上面的例子中,
%1 和 PATH 可以被其他有效数值替换。
%~ 语法被一个有效参数号码终止。 %~ 修定符不能跟 %* 一起使用。
举例:
%~dp0
比如你有个批处理a.bat在D:\qq文件夹下,a.bat内容为
cd /d %~dp0
在这里 cd /d %~dp0的意思就是 cd /d d:\qq,%0代表批处理本身 d:\qq\a.bat,
~dp是变量扩充,d既是扩充到分区号 d:,p就是扩充到路径 \qq,dp就是扩充到分区号路径 d:\qq
@:: (2) % 作为取模符号(求余数),需要在“评估表达式”中才起作用。
set 语法:
set /A <expression>
set 命令使用 /A 把后面的表达式评估为运算式。详见 “*. 评估器运算符优先权 set /A”
举例:
在命令行窗口中,用 1 个 % 表示特殊作用求余数的特殊符号:
set /a mod=100%3
在批处理文件中,用 2 个 % 表示求余数的特殊符号:
set /a mod=100%%3
% 如果不在评估表达式中,则在
在命令行窗口中,用 1 个 % 表示普通的 % 字面字符。
在批处理文件中,用 2 个 % 表示普通的 % 字面字符。
@:: *. 百分号 (%)
@:: (1) % 作为变量引导符,有几种用途:
在命令行窗口中,用 1 个 % 引号变量;
在批处理文件中,用 2 个 % 引号变量。
[1] 两个 % 夹着一个变量名称,表示取(扩展)这个变量的值。
举例:
set var=123
echo %var%
[2] 字段替换
{1} set var=%var:str1=str2%
会扩展 var 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 如果以星号 (*) 打头,则表示匹配 var 扩展结果的前缀。
[3] 字段截取
为变量的扩展结果字符串指定子字符串。
语法:
set <variable>=[%variable:~[<begin>][,<length>]%]
set <variable>=[%variable:~[<begin>][,<end>]%]
set 的内部逻辑与 C++ STL Verctor 容器的迭代器一致,遵循左闭右开的原则。
set 从扩展串中提取 [begin, end) 或 [begin, begin+length) 范围内的子串。
begin, end, length 都是可选项。
begin 必须为整数,可以是负数。end 必须是负整数。length 必须是正整数。
数值是正数时,可以省略数字前面的加号 (+)。
begin 表示偏移量,为子串在扩展串中的开头字符位置。
end 表示偏移量,为子串在扩展串中的结尾字符位置加 1 。即 end 位置总是不提取字符的。
length 表示子串的长度。
begin 若不提供,则默认值为 0,指向扩展串的第一个字符。
end 若不提供,则默认值为扩展字符串的最后一个字符的下一个位置。
length 若不提供,则默认值为扩展字符串的剩余长度。
end,length 若不提供,或可能超出扩展串的范围,则表示提取扩展字符串的剩余部分。
举例:
{1} set str=0123456789X987654321
偏移量: 0123456789X9876543210
↑ ↑
begin end
正偏移量从左向右偏移,默认从左 0 起算。 原串中左边第 1 个字符。
负偏移量从右向左偏移,默认从右 0 起算。 原串中右边第 1 个字符的后一个字符位置。
总长度: str.length = 10+1+9 = 20
以下例子,请对照例 {1} 的偏移量序列。
{2} set var=%str:~10,5%
var: X9876
begin 偏移量为 10,从左向右数第 10+1=11 个字符开始提取,这里是 X 。 因为左边起第 1 个字符的偏移量是 0 。
length = 5 为正数,表示提取的子串长度,提取 5 个字符。
{3} set var=%str:~10,-5%
var: X9876
begin 偏移量为 10,从左向右数第 10+1=11 个字符开始提取,这里是 X 。
end 的偏移量为 -5,从右向左数第 5 个字符结束提取。 注意是提取到 end 位置的前一个字符,即 6 。
{4} set var=%str:~-10,-5%
var: X9876
begin 偏移量为 -10,从右向左数第 10 个字符开始提取,这里是 X 。 因为右边起第 1 个字符的偏移量是 1 。
end 的偏移量为 -5,从右向左数第 5 个字符结束提取。 注意是提取到 end 位置的前一个字符,即 6 。
{5} set var=%str:~-10,5%
var: X9876
begin 偏移量为 -10,从右向左数第 10 个字符开始提取,这里是 X 。
length = 5 为正数,表示提取的子串长度,提取 5 个字符。
{6} set var=%str:~10%
var: X987654321
begin 偏移量为 10,从左向右数第 10+1=11 个字符开始提取,这里是 X 。
end,length 不提供,则会提取 str 变量的剩余字符。
{7} set var=%str:~-10%
var: X987654321
begin 偏移量为 -10,从右向左数第 10 个字符开始提取,这里是 X 。
end,length 不提供,则会提取 str 变量的剩余字符。
{8} set var=%str:~,5%
var: 01234
begin 不提供,则偏移量默认值为 0,从 str 的第 1 个字符开始提取。
length = 5 为正数,表示提取的子串长度,提取 5 个字符。
{9} set var=%str:~,-5%
var: 0123456789X9876
begin 不提供,则偏移量默认值为 0,从扩展串的第 1 个字符开始提取。
end 的偏移量为 -5,从右向左数第 5 个字符结束提取。 注意是提取到 end 位置的前一个字符,即 6 。
{10} set var=%str:~%
var: 0123456789X987654321
begin,end,length 都不选,则提取整个扩展串 str 。
{11} set var=%str:~10,500%
var: X987654321
length >= str.length, 超出扩展串的范围,则表示提取扩展字符串的剩余部分。
{12} set var=%str:~-21,5%
var: 01234
begin < str.begin, 则从左向右数第 1 个字符开始提取。
{13} set var=%str:~20,1%
var: null
begin >= str.length,提取失败。 这时 var 被设置为 null (未定义)。
{14} set var=%str:~10,-10%
set var=%str:~15,-10%
var: null
begin >= end,提取失败。 这时 var 被设置为 null (未定义)。
{15} set var=%str:~0,0%
set var=%str:~+0,-0%
set var=%str:~-0,+0%
set var=%str:~-0,-0%
var: null
begin,end,length 均为 0,提取失败。 这时 var 被设置为 null (未定义)。
{16} set var=%str:~,%
var: null
begin,end,length 都不提供,存在逗号(,) ,提取失败。 这时 var 被设置为 null (未定义)。
{17} set var=%str:10,5%
var: %str:10,5%
~ 不提供,则表达式无效,这时 var 为字面常量。
[3] %0, %1, %2 ... %9
表示取传入脚本或函数的参数,数字 n 为 1 到 9, 表示第 n 个参数。第 0 个参数为整个命令行调用语句。
%*
表示取传入脚本或函数的所有参数。不包括执行命令名称。
[4] for 循环中引用枚举变量
举例:
:: 1.bat 文件中
for /f "delims=" %%i in ('dir ') do set val=!val! %%i
echo val=%val%
执行 “1.bat”,将一个命令(dir)的返回结果传给一个变量(val)
[5] 扩充变量 (Variable substitution)
批处理参数 (%n) 的替代已被增强。您可以使用以下语法:
%~1 - 扩充 %1,然后删除引号 (")
%~f1 - 将 %1 扩充到一个完全合格的路径名
%~d1 - 仅将 %1 扩充到一个驱动器号
%~p1 - 仅将 %1 扩充到一个路径
%~n1 - 仅将 %1 扩充到一个文件名
%~x1 - 仅将 %1 扩充到一个文件扩展名
%~s1 - 扩充的路径指含有短名
%~a1 - 将 %1 扩充到文件属性
%~t1 - 将 %1 扩充到文件的日期/时间
%~z1 - 将 %1 扩充到文件的大小
%~$PATH:1 - 查找列在 PATH 环境变量的目录,并将 %1 扩充到找到的第一个完全合格的名称。
如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串。
可以组合修定符来取得多重结果:
%~dp1 - 只将 %1 扩展到驱动器号和路径
%~nx1 - 只将 %1 扩展到文件名和扩展名
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,并扩展到找到的第一个文件的驱动器号和路径。
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
在上面的例子中,
%1 和 PATH 可以被其他有效数值替换。
%~ 语法被一个有效参数号码终止。 %~ 修定符不能跟 %* 一起使用。
举例:
%~dp0
比如你有个批处理a.bat在D:\qq文件夹下,a.bat内容为
cd /d %~dp0
在这里 cd /d %~dp0的意思就是 cd /d d:\qq,%0代表批处理本身 d:\qq\a.bat,
~dp是变量扩充,d既是扩充到分区号 d:,p就是扩充到路径 \qq,dp就是扩充到分区号路径 d:\qq
@:: (2) % 作为取模符号(求余数),需要在“评估表达式”中才起作用。
set 语法:
set /A <expression>
set 命令使用 /A 把后面的表达式评估为运算式。详见 “*. 评估器运算符优先权 set /A”
举例:
在命令行窗口中,用 1 个 % 表示特殊作用求余数的特殊符号:
set /a mod=100%3
在批处理文件中,用 2 个 % 表示求余数的特殊符号:
set /a mod=100%%3
% 如果不在评估表达式中,则在
在命令行窗口中,用 1 个 % 表示普通的 % 字面字符。
在批处理文件中,用 2 个 % 表示普通的 % 字面字符。