批处理之家's Archiver

youxi01 发表于 2007-10-29 18:23

批处理命令set变量字符截取点点通

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

[size=5][color=blue]教程: 变量字符的截取[/color][/size][code]@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[/code]

novaa 发表于 2007-11-1 12:42

厉害啊

开始我总在看代码
发现看不下去
把代码直接执行
呵呵
发现了:):D

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

[color=blue]确实,
这个错字不能忽略,youxi 复制下面的改一下![/color]
::[code]@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[/code]

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[code]
call bat.bat>aa.txt<nul[/code]得到
第一屏 舍弃
                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
= 号左边为要替换掉的字符, 右边为需替换来的字符
= 号左边要替换掉的字符前面加个*号,代表第一次出现的字符及其前面的所有字符
========= 演示完毕 ========= 按任意键退出 ==========

这样看着舒服一些

[[i] 本帖最后由 hzfhzfhzfhzf 于 2008-11-25 10:44 编辑 [/i]]

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

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=18945&ptid=40]19#[/url] [i]p05401144[/i] [/b]

本论坛讨论的绝大部分内容都是批处理脚本程序,是运行于命令提示符下的,而非DOS下。

jemuillot 发表于 2012-9-1 21:26

请问如何写出替换第一个"之前的内容为ppp呢?

lateol 发表于 2013-7-4 04:41

内容我喜欢,收藏了。

页: [1] 2

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.