CMD SET % 字符串截取

 

@:: 使用 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 个 % 表示普通的 % 字面字符。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值