[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[转贴] 批处理命令set变量字符截取点点通

原文由 小楼春雨 发表
注意:本教程是一批处理程序。请将下面代码保存为一批处理文件,然后运行。

教程: 变量字符的截取
  1. @echo off
  2. rem code by 小楼一夜听春雨
  3. color 1f&rem num=15  nums=30
  4. mode con: cols=80 lines=35
  5. set "var=1234567890"
  6. set "num=               "
  7. set "nums=                              "
  8. rem 第一屏 舍弃
  9. cls&echo 第一屏 舍弃
  10. echo\&echo %num% var=%var%&echo\
  11. for /l %%i in (1 1 3) do call :dan %%i
  12. echo\
  13. for /l %%i in (0 1 1) do call :yi %%i
  14. echo\
  15. for /l %%i in (0 1 2) do call :_yi %%i
  16. echo  ~ 波浪号后面的数字:为正数表示舍弃变量的前位;
  17. echo  , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
  18. echo  , 逗号后面为负数表示舍弃变量的后几位
  19. echo\&echo\&pause&color 1e
  20. rem 第二屏 取
  21. cls&echo 第二屏 取
  22. echo\&echo %num% var=%var%&echo\
  23. for /l %%i in (-1 -1 -3) do call :dan %%i
  24. echo\
  25. for /l %%i in (-4 -1 -6) do call :er %%i
  26. echo\
  27. call :_er -8
  28. echo  ~ 波浪号后面直接跟负数表示取变量的后几位
  29. echo  , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
  30. echo  , 逗号后面为负数表示舍弃变量的后几位  
  31. echo\&echo\&pause&color 1f
  32. rem 第三屏 替换 删除
  33. cls&echo 第三屏 替换 删除
  34. set "var=abc:\123\ef:g\123\456"hij"789"klm\"
  35. echo\&echo %num%var=%var%
  36. echo\
  37. call :san
  38. echo  = 号左边为要替换掉的字符, 右边为需替换来的字符
  39. echo  = 号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
  40. echo\
  41. echo  ========= 演示完毕 ========= 按任意键退出 ==========
  42. pause>nul
  43. exit
  44. :dan
  45. set shu=%1
  46. if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=第
  47. if "%shu:~0,1%"=="-" set shu=%shu:~1%
  48. set str1=%%var:~%1%%%num%
  49. set str2=%aa%var的%ji%%shu%位%nums%
  50. call set str3=%%var:~%1%%%num%
  51. call echo %%str1:~0,15%% %%str2:~0,30%% %%str3:~0,15%%
  52. goto :eof
  53. :yi
  54. set shu=%1
  55. if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=第
  56. for /l %%i in (1 1 3) do (
  57. set str1=%%var:~%1,%%i%%%num%
  58. set str2=%aa%var的%ji%%shu%位之后取%%i位%nums%
  59. call set str3=%%var:~%1,%%i%%%num%
  60. call echo %%str1:~0,15%% %%str2:~0,26%% %%str3:~0,15%%
  61. if %%i==3 echo\
  62. )
  63. goto :eof
  64. :_yi
  65. for /l %%i in (-1 -1 -3) do (
  66. set str1=%%var:~%1,%%i%%%num%
  67. set str2=舍弃var的前%1位和%%i位%nums%
  68. call set str3=%%var:~%1,%%i%%%num%
  69. call echo %%str1:~0,15%% %%str2:~0,28%% %%str3:~0,15%%
  70. if %%i==-3 echo\
  71. )
  72. goto :eof
  73. :er
  74. set sss=%1
  75. set sss=%sss:~1%
  76. for /l %%i in (1 1 3) do (
  77. set str1=%%var:~%1,%%i%%%num%
  78. set str2=从var的倒数%sss%位开始取%%i位%nums%
  79. call set str3=%%var:~%1,%%i%%%num%
  80. call echo %%str1:~0,15%% %%str2:~0,24%%   %%str3:~0,15%%
  81. if %%i==3 echo\
  82. )
  83. goto :eof
  84. :_er
  85. set sss=%1
  86. set sss=%sss:~1%
  87. for /l %%i in (-1 -1 -3) do (
  88. set str1=%%var:~%1,%%i%%%num%
  89. set str2=从var的倒数%sss%位开始并舍弃最后%%i位%nums%
  90. call set str3=%%var:~%1,%%i%%%num%
  91. call echo %%str1:~0,15%% %%str2:~0,20%%   %%str3:~0,15%%
  92. if %%i==-3 echo\
  93. )
  94. goto :eof
  95. :san
  96. set str1=%%var:"=%%%num%
  97. set str2=删除var中的所有^"号%num%
  98. set str3=%var:"=%%nums%
  99. call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
  100. set str1=%%var:\=%%%num%
  101. set str2=删除var中的所有\号%num%
  102. set str3=%var:\=%%nums%
  103. call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
  104. set str1=%%var::=%%%num%
  105. set str2=删除var中的所有:号%num%
  106. set str3=%var::=%%nums%
  107. call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
  108. echo\
  109. set str1=%%var:"=好%%%num%
  110. set str2=替换var中的所有^"号为好字%num%
  111. set str3=%var:"=好%%nums%
  112. call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
  113. set str1=%%var:\=好%%%num%
  114. set str2=替换var中的所有\号为好字%num%
  115. set str3=%var:\=好%%nums%
  116. call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
  117. set str1=%%var::=好%%%num%
  118. set str2=替换var中的所有:号为好字%num%
  119. set str3=%var::=好%%nums%
  120. call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
  121. echo\
  122. set str1=%%var:*"=%%%num%
  123. set str3=%var:*"=%%nums%
  124. echo 删除var中的第一次出现的^"号及其前面的所有字符
  125. call echo %%str1:~0,15%%  %%str3:~0,30%%
  126. echo.
  127. set str1=%%var:*\=%%%num%
  128. set str3=%var:*\=%%nums%
  129. echo 删除var中的第一次出现的\号及其前面的所有字符
  130. call echo %%str1:~0,15%%  %%str3:~0,30%%
  131. echo.
  132. set str1=%%var:*:=%%%num%
  133. set str3=%var:*:=%%nums%
  134. echo 删除var中的第一次出现的:号及其前面的所有字符
  135. call echo %%str1:~0,15%%  %%str3:~0,30%%
  136. echo\
  137. set str1=%%var:*"=ppp%%%num%
  138. set str3=%var:*"=ppp%%nums%
  139. echo 替换var中的第一次出现的^"号及其前面的所有字符为ppp
  140. call echo %%str1:~0,15%%  %%str3:~0,30%%
  141. echo.
  142. set str1=%%var:*\=ppp%%%num%
  143. set str3=%var:*\=ppp%%nums%
  144. echo 替换var中的第一次出现的\号及其前面的所有字符为ppp
  145. call echo %%str1:~0,15%%  %%str3:~0,30%%
  146. echo.
  147. set str1=%%var:*:=ppp%%%num%
  148. set str3=%var:*:=ppp%%nums%
  149. echo 替换var中的第一次出现的:号及其前面的所有字符为ppp
  150. call echo %%str1:~0,15%%  %%str3:~0,30%%
  151. echo\
  152. goto :eof
复制代码
2

评分人数

厉害啊

开始我总在看代码
发现看不下去
把代码直接执行
呵呵
发现了:)
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

建议与疑问

建议:
随风的这篇在表述方面觉得不妥 如下

                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才能用!代替%)
ㄗs:A good programming is 99% sweat and 1% coffee!--①個亾

============ >   hi.baidu.com/novaa   <============

TOP

确实,
这个错字不能忽略,youxi 复制下面的改一下!

::
  1. @echo off&color 1f&rem num=15  nums=30
  2. mode con: cols=80 lines=35
  3. set "var=1234567890"
  4. set "num=               "
  5. set "nums=                              "
  6. rem 第一屏 舍弃
  7. cls&echo 第一屏 舍弃
  8. echo\&echo %num% var=%var%&echo\
  9. for /l %%i in (1 1 3) do call :dan %%i
  10. echo\
  11. for /l %%i in (0 1 1) do call :yi %%i
  12. echo\
  13. for /l %%i in (0 1 2) do call :_yi %%i
  14. echo  ~ 波浪号后面的数字:为正数表示舍弃变量的前位;
  15. echo  , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
  16. echo  , 逗号后面为负数表示舍弃变量的后几位
  17. echo\&echo\&pause&color 1e
  18. rem 第二屏 取
  19. cls&echo 第二屏 取
  20. echo\&echo %num% var=%var%&echo\
  21. for /l %%i in (-1 -1 -3) do call :dan %%i
  22. echo\
  23. for /l %%i in (-4 -1 -6) do call :er %%i
  24. echo\
  25. call :_er -8
  26. echo  ~ 波浪号后面直接跟负数表示取变量的后几位
  27. echo  , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;
  28. echo  , 逗号后面为负数表示舍弃变量的后几位  
  29. echo\&echo\&pause&color 1f
  30. rem 第三屏 替换 删除
  31. cls&echo 第三屏 替换 删除
  32. set "var=abc:\123\ef:g\123\456"hij"789"klm\"
  33. echo\&echo %num%var=%var%
  34. echo\
  35. call :san
  36. echo  = 号左边为要替换掉的字符, 右边为需替换来的字符
  37. echo  = 号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
  38. echo\
  39. echo  ========= 演示完毕 ========= 按任意键退出 ==========
  40. pause>nul
  41. exit
  42. :dan
  43. set shu=%1
  44. if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=前
  45. if "%shu:~0,1%"=="-" set shu=%shu:~1%
  46. set str1=%%var:~%1%%%num%
  47. set str2=%aa%var的%ji%%shu%位%nums%
  48. call set str3=%%var:~%1%%%num%
  49. call echo %%str1:~0,15%% %%str2:~0,30%% %%str3:~0,15%%
  50. goto :eof
  51. :yi
  52. set shu=%1
  53. if %shu% lss 0 (set aa=取&set ji=最后) else set aa=舍弃&set ji=前
  54. for /l %%i in (1 1 3) do (
  55. set str1=%%var:~%1,%%i%%%num%
  56. set str2=%aa%var的%ji%%shu%位之后取%%i位%nums%
  57. call set str3=%%var:~%1,%%i%%%num%
  58. call echo %%str1:~0,15%% %%str2:~0,26%% %%str3:~0,15%%
  59. if %%i==3 echo\
  60. )
  61. goto :eof
  62. :_yi
  63. for /l %%i in (-1 -1 -3) do (
  64. set str1=%%var:~%1,%%i%%%num%
  65. set str2=舍弃var的前%1位和%%i位%nums%
  66. call set str3=%%var:~%1,%%i%%%num%
  67. call echo %%str1:~0,15%% %%str2:~0,28%% %%str3:~0,15%%
  68. if %%i==-3 echo\
  69. )
  70. goto :eof
  71. :er
  72. set sss=%1
  73. set sss=%sss:~1%
  74. for /l %%i in (1 1 3) do (
  75. set str1=%%var:~%1,%%i%%%num%
  76. set str2=从var的倒数%sss%位开始取%%i位%nums%
  77. call set str3=%%var:~%1,%%i%%%num%
  78. call echo %%str1:~0,15%% %%str2:~0,24%%   %%str3:~0,15%%
  79. if %%i==3 echo\
  80. )
  81. goto :eof
  82. :_er
  83. set sss=%1
  84. set sss=%sss:~1%
  85. for /l %%i in (-1 -1 -3) do (
  86. set str1=%%var:~%1,%%i%%%num%
  87. set str2=从var的倒数%sss%位开始并舍弃最后%%i位%nums%
  88. call set str3=%%var:~%1,%%i%%%num%
  89. call echo %%str1:~0,15%% %%str2:~0,20%%   %%str3:~0,15%%
  90. if %%i==-3 echo\
  91. )
  92. goto :eof
  93. :san
  94. set str1=%%var:"=%%%num%
  95. set str2=删除var中的所有^"号%num%
  96. set str3=%var:"=%%nums%
  97. call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
  98. set str1=%%var:\=%%%num%
  99. set str2=删除var中的所有\号%num%
  100. set str3=%var:\=%%nums%
  101. call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
  102. set str1=%%var::=%%%num%
  103. set str2=删除var中的所有:号%num%
  104. set str3=%var::=%%nums%
  105. call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%
  106. echo\
  107. set str1=%%var:"=好%%%num%
  108. set str2=替换var中的所有^"号为好字%num%
  109. set str3=%var:"=好%%nums%
  110. call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
  111. set str1=%%var:\=好%%%num%
  112. set str2=替换var中的所有\号为好字%num%
  113. set str3=%var:\=好%%nums%
  114. call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
  115. set str1=%%var::=好%%%num%
  116. set str2=替换var中的所有:号为好字%num%
  117. set str3=%var::=好%%nums%
  118. call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%
  119. echo\
  120. set str1=%%var:*"=%%%num%
  121. set str3=%var:*"=%%nums%
  122. echo 删除var中的第一次出现的^"号及其前面的所有字符
  123. call echo %%str1:~0,15%%  %%str3:~0,30%%
  124. echo.
  125. set str1=%%var:*\=%%%num%
  126. set str3=%var:*\=%%nums%
  127. echo 删除var中的第一次出现的\号及其前面的所有字符
  128. call echo %%str1:~0,15%%  %%str3:~0,30%%
  129. echo.
  130. set str1=%%var:*:=%%%num%
  131. set str3=%var:*:=%%nums%
  132. echo 删除var中的第一次出现的:号及其前面的所有字符
  133. call echo %%str1:~0,15%%  %%str3:~0,30%%
  134. echo\
  135. set str1=%%var:*"=ppp%%%num%
  136. set str3=%var:*"=ppp%%nums%
  137. echo 替换var中的第一次出现的^"号及其前面的所有字符为ppp
  138. call echo %%str1:~0,15%%  %%str3:~0,30%%
  139. echo.
  140. set str1=%%var:*\=ppp%%%num%
  141. set str3=%var:*\=ppp%%nums%
  142. echo 替换var中的第一次出现的\号及其前面的所有字符为ppp
  143. call echo %%str1:~0,15%%  %%str3:~0,30%%
  144. echo.
  145. set str1=%%var:*:=ppp%%%num%
  146. set str3=%var:*:=ppp%%nums%
  147. echo 替换var中的第一次出现的:号及其前面的所有字符为ppp
  148. call echo %%str1:~0,15%%  %%str3:~0,30%%
  149. echo\
  150. goto :eof
复制代码
技术问题请到论坛发帖求助!

TOP

理解了,有待于深入学习。

TOP

真的是的喔 老大,我发现了一个有确的问题喔
你把上面的代码复制到一个SET.bat的文件里面运行之后就不行,我把文件名改为1.bat就行了

TOP

最好不要养成用命令作批处理文件名的习惯,否则,以后奇怪的问题还会更多。
技术问题请到论坛发帖求助!

TOP

呵呵,不土。。。。。。

TOP

看帖回萜,养成好习惯

TOP

麻烦说一下
echo\&echo %num% var=%var%&echo\
这句中echo\什么意思?

TOP

看看了,好东西,收藏了

TOP

认真看,一边看代码一边实践,好好学习!

TOP

看着晕
将代码保存为bat.bat
  1. call bat.bat>aa.txt<nul
复制代码
得到
第一屏 舍弃
                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 编辑 ]

TOP

太好啦

爱死楼主啦。。

TOP

楼主此帖解吾数月之惑矣!!感谢!

TOP

返回列表