标题: [转贴] 批处理命令set变量字符截取点点通 [打印本页]
作者: youxi01 时间: 2007-10-29 18:23 标题: 批处理命令set变量字符截取点点通
原文由 小楼春雨 发表
注意:本教程是一批处理程序。请将下面代码保存为一批处理文件,然后运行。
教程: 变量字符的截取- @echo off
- rem code by 小楼一夜听春雨
- color 1f&rem num=15 nums=30
- mode con: cols=80 lines=35
- set "var=1234567890"
- set "num= "
- set "nums= "
- rem 第一屏 舍弃
- cls&echo 第一屏 舍弃
- echo\&echo %num% var=%var%&echo\
- for /l %%i in (1 1 3) do call :dan %%i
- echo\
- for /l %%i in (0 1 1) do call :yi %%i
- echo\
- for /l %%i in (0 1 2) do call :_yi %%i
- echo ~ 波浪号后面的数字:为正数表示舍弃变量的前位;
- echo , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
- echo , 逗号后面为负数表示舍弃变量的后几位
- echo\&echo\&pause&color 1e
- rem 第二屏 取
- cls&echo 第二屏 取
- echo\&echo %num% var=%var%&echo\
- for /l %%i in (-1 -1 -3) do call :dan %%i
- echo\
- for /l %%i in (-4 -1 -6) do call :er %%i
- echo\
- call :_er -8
- echo ~ 波浪号后面直接跟负数表示取变量的后几位
- echo , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
- echo , 逗号后面为负数表示舍弃变量的后几位
- echo\&echo\&pause&color 1f
- rem 第三屏 替换 删除
- cls&echo 第三屏 替换 删除
- set "var=abc:\123\ef:g\123\456"hij"789"klm\"
- echo\&echo %num%var=%var%
- echo\
- call :san
- echo = 号左边为要替换掉的字符, 右边为需替换来的字符
- echo = 号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
- echo\
- echo ========= 演示完毕 ========= 按任意键退出 ==========
- pause>nul
- exit
-
- :dan
- set shu=%1
- if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=第
- if "%shu:~0,1%"=="-" set shu=%shu:~1%
- set str1=%%var:~%1%%%num%
- set str2=%aa%var的%ji%%shu%位%nums%
- call set str3=%%var:~%1%%%num%
- call echo %%str1:~0,15%% %%str2:~0,30%% %%str3:~0,15%%
- goto :eof
- :yi
- set shu=%1
- if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=第
- for /l %%i in (1 1 3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=%aa%var的%ji%%shu%位之后取%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,26%% %%str3:~0,15%%
- if %%i==3 echo\
- )
- goto :eof
- :_yi
- for /l %%i in (-1 -1 -3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=舍弃var的前%1位和%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,28%% %%str3:~0,15%%
- if %%i==-3 echo\
- )
- goto :eof
- :er
- set sss=%1
- set sss=%sss:~1%
- for /l %%i in (1 1 3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=从var的倒数%sss%位开始取%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,24%% %%str3:~0,15%%
- if %%i==3 echo\
- )
- goto :eof
- :_er
- set sss=%1
- set sss=%sss:~1%
- for /l %%i in (-1 -1 -3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=从var的倒数%sss%位开始并舍弃最后%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,20%% %%str3:~0,15%%
- if %%i==-3 echo\
- )
- goto :eof
- :san
- set str1=%%var:"=%%%num%
- set str2=删除var中的所有^"号%num%
- set str3=%var:"=%%nums%
- call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
- set str1=%%var:\=%%%num%
- set str2=删除var中的所有\号%num%
- set str3=%var:\=%%nums%
- call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
- set str1=%%var::=%%%num%
- set str2=删除var中的所有:号%num%
- set str3=%var::=%%nums%
- call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
- echo\
- set str1=%%var:"=好%%%num%
- set str2=替换var中的所有^"号为好字%num%
- set str3=%var:"=好%%nums%
- call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
- set str1=%%var:\=好%%%num%
- set str2=替换var中的所有\号为好字%num%
- set str3=%var:\=好%%nums%
- call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
- set str1=%%var::=好%%%num%
- set str2=替换var中的所有:号为好字%num%
- set str3=%var::=好%%nums%
- call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
- echo\
- set str1=%%var:*"=%%%num%
- set str3=%var:*"=%%nums%
- echo 删除var中的第一次出现的^"号及其前面的所有字符
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*\=%%%num%
- set str3=%var:*\=%%nums%
- echo 删除var中的第一次出现的\号及其前面的所有字符
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*:=%%%num%
- set str3=%var:*:=%%nums%
- echo 删除var中的第一次出现的:号及其前面的所有字符
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo\
- set str1=%%var:*"=ppp%%%num%
- set str3=%var:*"=ppp%%nums%
- echo 替换var中的第一次出现的^"号及其前面的所有字符为ppp
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*\=ppp%%%num%
- set str3=%var:*\=ppp%%nums%
- echo 替换var中的第一次出现的\号及其前面的所有字符为ppp
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*:=ppp%%%num%
- set str3=%var:*:=ppp%%nums%
- echo 替换var中的第一次出现的:号及其前面的所有字符为ppp
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo\
- goto :eof
复制代码
作者: novaa 时间: 2007-11-1 12:42 标题: 厉害啊
开始我总在看代码
发现看不下去
把代码直接执行
呵呵
发现了:)
作者: novaa 时间: 2007-11-14 19:53 标题: 建议与疑问
建议:
随风的这篇在表述方面觉得不妥 如下
var=1234567890
%var:~1% 舍弃var的第1位 234567890
%var:~2% 舍弃var的第2位 34567890
%var:~3% 舍弃var的第3位 4567890
应该为
%var:~1% 舍弃var的第1位 234567890
%var:~2% 舍弃var的前2位 34567890
%var:~3% 舍弃var的前3位 4567890
呵呵
算我咬文嚼字吗?
我就误解了
疑问
是否只是在开始使用了 setlocal enabledelayedexpansion
才可以用!代替%(我测试只有用了setlocal enabledelayedexpansion才能用!代替%)
作者: 随风 时间: 2007-11-14 20:53
确实,
这个错字不能忽略,youxi 复制下面的改一下!
::- @echo off&color 1f&rem num=15 nums=30
- mode con: cols=80 lines=35
- set "var=1234567890"
- set "num= "
- set "nums= "
- rem 第一屏 舍弃
- cls&echo 第一屏 舍弃
- echo\&echo %num% var=%var%&echo\
- for /l %%i in (1 1 3) do call :dan %%i
- echo\
- for /l %%i in (0 1 1) do call :yi %%i
- echo\
- for /l %%i in (0 1 2) do call :_yi %%i
- echo ~ 波浪号后面的数字:为正数表示舍弃变量的前位;
- echo , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
- echo , 逗号后面为负数表示舍弃变量的后几位
- echo\&echo\&pause&color 1e
- rem 第二屏 取
- cls&echo 第二屏 取
- echo\&echo %num% var=%var%&echo\
- for /l %%i in (-1 -1 -3) do call :dan %%i
- echo\
- for /l %%i in (-4 -1 -6) do call :er %%i
- echo\
- call :_er -8
- echo ~ 波浪号后面直接跟负数表示取变量的后几位
- echo , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
- echo , 逗号后面为负数表示舍弃变量的后几位
- echo\&echo\&pause&color 1f
- rem 第三屏 替换 删除
- cls&echo 第三屏 替换 删除
- set "var=abc:\123\ef:g\123\456"hij"789"klm\"
- echo\&echo %num%var=%var%
- echo\
- call :san
- echo = 号左边为要替换掉的字符, 右边为需替换来的字符
- echo = 号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
- echo\
- echo ========= 演示完毕 ========= 按任意键退出 ==========
- pause>nul
- exit
-
- :dan
- set shu=%1
- if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=前
- if "%shu:~0,1%"=="-" set shu=%shu:~1%
- set str1=%%var:~%1%%%num%
- set str2=%aa%var的%ji%%shu%位%nums%
- call set str3=%%var:~%1%%%num%
- call echo %%str1:~0,15%% %%str2:~0,30%% %%str3:~0,15%%
- goto :eof
- :yi
- set shu=%1
- if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=前
- for /l %%i in (1 1 3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=%aa%var的%ji%%shu%位之后取%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,26%% %%str3:~0,15%%
- if %%i==3 echo\
- )
- goto :eof
- :_yi
- for /l %%i in (-1 -1 -3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=舍弃var的前%1位和%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,28%% %%str3:~0,15%%
- if %%i==-3 echo\
- )
- goto :eof
- :er
- set sss=%1
- set sss=%sss:~1%
- for /l %%i in (1 1 3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=从var的倒数%sss%位开始取%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,24%% %%str3:~0,15%%
- if %%i==3 echo\
- )
- goto :eof
- :_er
- set sss=%1
- set sss=%sss:~1%
- for /l %%i in (-1 -1 -3) do (
- set str1=%%var:~%1,%%i%%%num%
- set str2=从var的倒数%sss%位开始并舍弃最后%%i位%nums%
- call set str3=%%var:~%1,%%i%%%num%
- call echo %%str1:~0,15%% %%str2:~0,20%% %%str3:~0,15%%
- if %%i==-3 echo\
- )
- goto :eof
- :san
- set str1=%%var:"=%%%num%
- set str2=删除var中的所有^"号%num%
- set str3=%var:"=%%nums%
- call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
- set str1=%%var:\=%%%num%
- set str2=删除var中的所有\号%num%
- set str3=%var:\=%%nums%
- call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
- set str1=%%var::=%%%num%
- set str2=删除var中的所有:号%num%
- set str3=%var::=%%nums%
- call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
- echo\
- set str1=%%var:"=好%%%num%
- set str2=替换var中的所有^"号为好字%num%
- set str3=%var:"=好%%nums%
- call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
- set str1=%%var:\=好%%%num%
- set str2=替换var中的所有\号为好字%num%
- set str3=%var:\=好%%nums%
- call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
- set str1=%%var::=好%%%num%
- set str2=替换var中的所有:号为好字%num%
- set str3=%var::=好%%nums%
- call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
- echo\
- set str1=%%var:*"=%%%num%
- set str3=%var:*"=%%nums%
- echo 删除var中的第一次出现的^"号及其前面的所有字符
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*\=%%%num%
- set str3=%var:*\=%%nums%
- echo 删除var中的第一次出现的\号及其前面的所有字符
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*:=%%%num%
- set str3=%var:*:=%%nums%
- echo 删除var中的第一次出现的:号及其前面的所有字符
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo\
- set str1=%%var:*"=ppp%%%num%
- set str3=%var:*"=ppp%%nums%
- echo 替换var中的第一次出现的^"号及其前面的所有字符为ppp
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*\=ppp%%%num%
- set str3=%var:*\=ppp%%nums%
- echo 替换var中的第一次出现的\号及其前面的所有字符为ppp
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo.
- set str1=%%var:*:=ppp%%%num%
- set str3=%var:*:=ppp%%nums%
- echo 替换var中的第一次出现的:号及其前面的所有字符为ppp
- call echo %%str1:~0,15%% %%str3:~0,30%%
- echo\
- goto :eof
复制代码
作者: hsyxh 时间: 2008-2-14 22:07
理解了,有待于深入学习。
作者: 希望的寄托 时间: 2008-2-21 09:27
真的是的喔 老大,我发现了一个有确的问题喔
你把上面的代码复制到一个SET.bat的文件里面运行之后就不行,我把文件名改为1.bat就行了
作者: 随风 时间: 2008-2-21 17:17
最好不要养成用命令作批处理文件名的习惯,否则,以后奇怪的问题还会更多。
作者: nut 时间: 2008-3-3 02:50
呵呵,不土。。。。。。
作者: 小向飞田 时间: 2008-8-11 20:36
看帖回萜,养成好习惯
作者: condy 时间: 2008-9-5 15:13
麻烦说一下
echo\&echo %num% var=%var%&echo\
这句中echo\什么意思?
作者: xunaco 时间: 2008-9-26 16:05
看看了,好东西,收藏了
作者: leaparde 时间: 2008-11-21 16:54
认真看,一边看代码一边实践,好好学习!
作者: hzfhzfhzfhzf 时间: 2008-11-25 10:42
看着晕
将代码保存为bat.bat复制代码
得到
第一屏 舍弃
var=1234567890
%var:~1% 舍弃var的第1位 234567890
%var:~2% 舍弃var的第2位 34567890
%var:~3% 舍弃var的第3位 4567890
%var:~0,1% 舍弃var的第0位之后取1位 1
%var:~0,2% 舍弃var的第0位之后取2位 12
%var:~0,3% 舍弃var的第0位之后取3位 123
%var:~1,1% 舍弃var的第1位之后取1位 2
%var:~1,2% 舍弃var的第1位之后取2位 23
%var:~1,3% 舍弃var的第1位之后取3位 234
%var:~0,-1% 舍弃var的前0位和-1位 123456789
%var:~0,-2% 舍弃var的前0位和-2位 12345678
%var:~0,-3% 舍弃var的前0位和-3位 1234567
%var:~1,-1% 舍弃var的前1位和-1位 23456789
%var:~1,-2% 舍弃var的前1位和-2位 2345678
%var:~1,-3% 舍弃var的前1位和-3位 234567
%var:~2,-1% 舍弃var的前2位和-1位 3456789
%var:~2,-2% 舍弃var的前2位和-2位 345678
%var:~2,-3% 舍弃var的前2位和-3位 34567
~ 波浪号后面的数字:为正数表示舍弃变量的前位;
, 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
, 逗号后面为负数表示舍弃变量的后几位
请按任意键继续. . .
第二屏 取
var=1234567890
%var:~-1% 取var的最后1位 0
%var:~-2% 取var的最后2位 90
%var:~-3% 取var的最后3位 890
%var:~-4,1% 从var的倒数4位开始取1位 7
%var:~-4,2% 从var的倒数4位开始取2位 78
%var:~-4,3% 从var的倒数4位开始取3位 789
%var:~-5,1% 从var的倒数5位开始取1位 6
%var:~-5,2% 从var的倒数5位开始取2位 67
%var:~-5,3% 从var的倒数5位开始取3位 678
%var:~-6,1% 从var的倒数6位开始取1位 5
%var:~-6,2% 从var的倒数6位开始取2位 56
%var:~-6,3% 从var的倒数6位开始取3位 567
%var:~-8,-1% 从var的倒数8位开始并舍弃最后-1位 3456789
%var:~-8,-2% 从var的倒数8位开始并舍弃最后-2位 345678
%var:~-8,-3% 从var的倒数8位开始并舍弃最后-3位 34567
~ 波浪号后面直接跟负数表示取变量的后几位
, 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
, 逗号后面为负数表示舍弃变量的后几位
请按任意键继续. . .
第三屏 替换 删除
var=abc:\123\ef:g\123\456"hij"789"klm\
%var:"=% 删除var中的所有"号 abc:\123\ef:g\123\456hij789klm
%var:\=% 删除var中的所有\号 abc:123ef:g123456"hij"789"klm
%var::=% 删除var中的所有:号 abc\123\efg\123\456"hij"789"kl
%var:"=好% 替换var中的所有"号为好字 abc:\123\ef:g\123\456好hij好789好
%var:\=好% 替换var中的所有\号为好字 abc:好123好ef:g好123好456"hij"789"
%var::=好% 替换var中的所有:号为好字 abc好\123\ef好g\123\456"hij"789"
删除var中的第一次出现的"号及其前面的所有字符
%var:*"=% hij"789"klm\
删除var中的第一次出现的\号及其前面的所有字符
%var:*\=% 123\ef:g\123\456"hij"789"klm\
删除var中的第一次出现的:号及其前面的所有字符
%var:*:=% \123\ef:g\123\456"hij"789"klm\
替换var中的第一次出现的"号及其前面的所有字符为ppp
%var:*"=ppp% ppphij"789"klm\
替换var中的第一次出现的\号及其前面的所有字符为ppp
%var:*\=ppp% ppp123\ef:g\123\456"hij"789"kl
替换var中的第一次出现的:号及其前面的所有字符为ppp
%var:*:=ppp% ppp\123\ef:g\123\456"hij"789"k
= 号左边为要替换掉的字符, 右边为需替换来的字符
= 号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
========= 演示完毕 ========= 按任意键退出 ==========
这样看着舒服一些
[ 本帖最后由 hzfhzfhzfhzf 于 2008-11-25 10:44 编辑 ]
作者: lsp19880301 时间: 2008-12-8 23:39 标题: 太好啦
爱死楼主啦。。
作者: langhun 时间: 2008-12-9 10:41
楼主此帖解吾数月之惑矣!!感谢!
作者: specter 时间: 2008-12-9 14:20
学习了!
不过我不太用这种东西!
作者: too_lazy 时间: 2008-12-9 17:34
不是很懂~~
照顶~~~~
作者: ph221 时间: 2009-1-11 14:57
哇咔咔 学习了 不错
作者: p05401144 时间: 2009-1-13 18:21
学习了,以前都是在文件里看教程,在dos窗口里看教程这还是第一次
作者: q625805390 时间: 2009-7-27 17:35
多谢2楼提示,果然效果不错。
作者: nopr 时间: 2009-8-6 19:36
被这么长的代码吓到了。没看完就执行了
作者: hdw 时间: 2009-8-7 11:03
很全面。讲解也清楚。收藏了
作者: wwenyunkui 时间: 2009-8-7 14:32
一目了然,不过虽然执行的时候看明白了,可是具体规律还是没有能够总结出来
作者: ghostwar 时间: 2009-9-29 16:16
看不太明白
继续努力!
作者: xslxslxsl 时间: 2011-7-22 23:10
好复杂啊,再继续好好学习
作者: clonecd 时间: 2012-5-18 10:22
哈哈,从这个批处理,我学习到不少东西,真是感谢啊。
作者: dymy4166 时间: 2012-7-25 09:40
继续学习中
作者: cjiabing 时间: 2012-7-27 09:23
回复 19# p05401144
本论坛讨论的绝大部分内容都是批处理脚本程序,是运行于命令提示符下的,而非DOS下。
作者: jemuillot 时间: 2012-9-1 21:26
请问如何写出替换第一个"之前的内容为ppp呢?
作者: lateol 时间: 2013-7-4 04:41
内容我喜欢,收藏了。
作者: suseek 时间: 2013-9-11 17:51
我也想知道替换某字符之前但不包括该字符如何实现
作者: wangx 时间: 2013-9-16 14:30
讲解方式很新颖啊,谢谢分享。
作者: changedirectory 时间: 2013-10-5 09:31
谢谢,又学了新知识点!
作者: duofangpao 时间: 2014-3-18 11:21
这种教学方式不错,就是代码看的太累,没完全看明白
作者: Linuxer 时间: 2014-8-8 18:38
回复 4# 随风
感谢两位大神,,这既可以学习set截取字符串用法,又可以学习bat的代码。真是一举夺得。
不知道为什么,用楼主的bat需要以管理员运行(双击运行卡在“第一屏舍弃那,bat屏幕闪”),,你这个bat直接双击就能顺利运行。
作者: lrfeng 时间: 2017-8-11 15:55
这个教案直观实用,解了我多处疑惑,谢谢
作者: 其实很简单 时间: 2020-7-7 11:16
真棒 解惑了解惑了
作者: liziyall 时间: 2022-5-1 23:20
本人研究出来的通用格式:
通用格式:
①set str=%str:~起始位m,取舍数n%
注解:(n为正整数时表示从m位开始向右取n个字符;n为负数时表示从最后 一位开始向左舍弃n个字符;当n为0时不会截取任何字符,即:str=空值。)
②set str=%str:~起始位m% 注解:(不管m是正还是负都表示截取m位和其后的所有字符)
通用原则:
①字符串的排位:从左到右依次为第0位、第1位、第2位...;从右到左依次为第-1位、第-2位、第-3位...。
②截取过程:先截取再取舍。第一步:先截取起始位之后的所有字符串(包括起始位)(第一个参数m控制截取)。第二步:再对截取到的字符串进行取舍。具体是取还是舍看n的值,如果n为正数负数或0请看格式①和注解,如果n参数没有请看格式②和注解。(参数n控制取舍)
例如:
@echo off
set str=123456789
set str=%str:~3,0%
echo %str%
pause
结果显示ECHO处于关闭状态
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |