Board logo

标题: [CMD]理解变量字符的截取功能 [打印本页]

作者: lxmxn     时间: 2006-12-17 06:35    标题: [CMD]理解变量字符的截取功能


  其实CMD里面变量的字符截取功能很实用,但是有的朋友还没有真正理解里面的规律,所以今天特意写了以下代码,希望对新手朋友理解CMD下面变量的字符截取功能有所帮助。

::code by lxmxn @ cn-dos.net .
::目的:帮助新手们更好的理解变量字符截取功能.
::Date 2006-12-16 .
::说明:有的变量截取之后值为空,这是正常的.
@echo off&setlocal EnableDelayedexpansion
::设置变量var的值:
set var=0123456789ABCDEF
call :begin
for /l %%a in (1,3,15) do (
    for /l %%b in (1,4,15) do (
        call :printf %%a %%b
    )
)
call :begin
for /l %%a in (1,4,15) do (
    for /l %%b in (-1,-3,-15) do (
        call :printf  %%a %%b
    )
)
call :begin
for /l %%a in (-2,-3,-15) do (
    for /l %%b in (1,4,15) do (
        call :printf  %%a %%b
    )
)
call :begin
for /l %%a in (-1,-4,-15) do (
    for /l %%b in (-2,-3,-15) do (
        call :printf  %%a %%b
    )
)
pause
endlocal&cls&echo.
echo 演示结束了,任意键退出……
pause>nul
goto :eof

::输出结果:
:printf
    echo %%var:~%1,%2%%        截取之后的字符为:        !var:~%1,%2!
    goto :eof

::清理屏幕:
:begin
    echo\&pause&cls&echo.
    echo                         变量var的值为:        %var%
    echo.
    goto :eof
      点击这里下载附件(Getstr.rar)

[ Last edited by lxmxn on 2007-10-31 at 06:33 PM ]
作者: ccwan     时间: 2006-12-17 06:46
谢谢lxmxn兄,对我等新手帮助很大啊!
作者: zh159     时间: 2006-12-17 06:51
建议大家复制代码保存为BAT文件后在“截取之后的字符为”“变量var的值为”之前用TAB加一个制表符,这样显示就整洁了
作者: lxmxn     时间: 2006-12-17 07:41

  Re ccwan :
 
  汗,你还是新手啊?
  多谢加分鼓励。^_^

  Re zh159 :

  多谢兄的提议和加分。
  自己把帖子重新编辑了半天,但是可惜的是最终还是没有达到整齐的显示效果。最后只能以附件的形式让大家下载了。

作者: redtek     时间: 2006-12-17 07:47
太精彩了~~
字体为什么变小了?
作者: lxmxn     时间: 2006-12-17 07:57


  Quote:
Originally posted by redtek at 2006-12-17 07:47:
太精彩了~~
字体为什么变小了?


  兄所说的字体变小了,是指的什么?我主题的字体变大了才对呀。

作者: jmz573515     时间: 2006-12-17 08:01
好东西,学习。
作者: lianjiang2004     时间: 2006-12-17 10:03
学习了。好贴。
作者: vkill     时间: 2006-12-17 21:49
字太小了
作者: ccwan     时间: 2006-12-17 22:03
若是因字小不好读,可以按住Ctrl键,然后向上转动鼠标滑轮就大了,向下是变小。
作者: wydos     时间: 2006-12-18 00:07
精彩!!!
作者: lxmxn     时间: 2006-12-18 03:21

  把字体调整了一下,大家再看字体有多大。
 
  我昨天特意把字体调整得比较大,今天上论坛怎么突然一下变很小了,不知道是什么原因。

作者: freeapple     时间: 2006-12-18 03:35
经典,新手有福了!呵呵
作者: redtek     时间: 2006-12-24 23:59
精彩~~好贴子顶起来~:)
作者: xuzhenhui     时间: 2007-1-13 21:41
好东西,好得说不出,原来批处理还有如此细致的功能.
作者: lotus516     时间: 2007-1-14 03:57
谢谢lxmxn兄,对我等新手帮助很大啊!
作者: yesmao     时间: 2007-1-14 04:22
路过学习一下,3Q
作者: netchxing     时间: 2007-1-14 12:41
学习了,谢谢!
作者: wuyugui     时间: 2007-1-15 23:48
太复杂了,看不懂,能不能每行加注解呀 调用和循环过程是怎样的 说一下呀 对于CALL
goto :eof这个东东我都看不懂,关于这call goto :eof能说明一下吗?谢谢!
作者: lxmxn     时间: 2007-1-16 04:39

  call 可以调用一些外部命令和内部命令,也可以调用批处理程序内的标签段。这里call :print表示调用这个批处理程序下面的:print程序段。另外,call 还可以加参数调用批程序段。

  goto :eof 如果在一个标签里面,那么就表示跳出此标签,如果在批处理程序其它的位置,表示跳转到批处理程序的结尾出,就表示退出批程序。

作者: lbqldos     时间: 2007-2-2 08:06
精彩,有学到东西了,3Q!
作者: lpclimber     时间: 2007-3-4 22:14
强呀!要好好学习一下!
作者: qingfushuan     时间: 2007-3-4 22:42    标题: 强啊,学习了

以LZ的实力肯定能够再作一份类似的延时变量.bat,热切盼望中
作者: tianlijian     时间: 2007-3-14 04:53
echo\&pause&cls&echo.
中的\ 起什么作用
作者: yangzhiyi     时间: 2007-3-17 09:49
强强强,好强,到后面再跳出回来,循环做得真是高。
作者: HUNRYBECKY     时间: 2007-3-17 11:47
不错。收藏。这方面还没有深入学习
作者: star8289     时间: 2007-3-22 05:01
echo %%var:~%1,%2%%        截取之后的字符为:        !var:~%1,%2!
                              -------------------这句不甚明了,可以详细的解释下么?
   谢谢~
作者: enliang     时间: 2007-3-22 05:16
新手,还有些看不懂
作者: lxmxn     时间: 2007-3-22 07:51

Re tianlijian:
这里的/和 ; , . \ 等符号的作用一样,表示输出一个空行。

Re star8289:
你可以结合代码的输出来分析它的作用,其中%1和%2代表第一、第二个命令行参数。

作者: zzhh612     时间: 2007-3-25 10:06    标题: 好东西值得我们推广.多好的教学手段...

能不能把批处理命令都做成这种带演示功能的批处理代码.不过这要高手才能完成的事情了,希望有心人去做这件有意义的事情
作者: stornager     时间: 2007-3-26 06:20    标题: 楼主真强

我要争取赶上楼主,谢谢啦!
作者: lxmxn     时间: 2007-3-27 00:17


  Quote:
Originally posted by stornager at 2007-3-25 17:20:
我要争取赶上楼主,谢谢啦!


  呵呵,但愿如此~

作者: lp1129     时间: 2007-3-28 00:14
强烈的支持,受益匪浅啊
作者: 9306516     时间: 2007-4-14 09:08
答案暗暗暗暗暗暗暗暗
作者: tongwandou     时间: 2007-4-19 11:52
这种教法太好了,我也基本上会提取了,但是不知道有什么实用的价值?
作者: lxmxn     时间: 2007-4-19 13:16
Re tongwandou:

实用价值可大呢。比如你可以提取一个字符串的前3个字符,或者后5个字符,或者第10到第20个字符,很多都可以用到。
作者: minmin888     时间: 2007-5-8 20:57
好东西,全面.
作者: 8250     时间: 2007-5-9 09:31


  Quote:
Originally posted by lxmxn at 2007-1-16 04:39:

  goto :eof 如果在一个标签里面,那么就表示跳出此标签,如果在批处理程序其它的位置,表示跳转到批处理程序的结尾出,就表示退出批程序。

首先感谢版主的分享。
其次请教一个问题:
:eof是否是一个特殊的标签和一般普通的标签不同?
作者: bing614     时间: 2007-5-9 11:05
不错,又学到一招,多谢楼主。
作者: lxmxn     时间: 2007-5-9 13:29


  Quote:
Originally posted by 8250 at 2007-5-9 09:31:

首先感谢版主的分享。
其次请教一个问题:
:eof是否是一个特殊的标签和一般普通的标签不同?

:EOF 一般和 goto 命令在一起使用,表示 End Of File ,意即文件的末尾。

如果这个 goto :EOF 在一个批处理文件中,表示跳到文件尾,可以理解成退出批处理,如果 goto :EOF 在一个批处理脚本程序的标签程序中,那么就退出当前的标签,回到批处理脚本程序中来。

你可以通过一些练习来理解它的作用。
作者: flyinspace     时间: 2007-5-9 13:31


  Quote:
Originally posted by lxmxn at 2007-5-9 01:29 PM:

:EOF 一般和 goto 命令在一起使用,表示 End Of File ,意即文件的末尾。

如果这个 goto :EOF 在一个批处理文件中,表示跳到文件尾,可以理解成退出批 ...

可以通过 call /? 和 goto /? 来学习这个。。
作者: yh6688     时间: 2007-6-1 13:11
ok!
作者: enliang     时间: 2007-6-16 11:04
好资料.宝典
作者: bd123456789     时间: 2007-6-17 10:42
太好了,感谢指导!
不过,得请教一个问题:
pause>nul
是什么意思???
另外,为什么要启用"延迟的环境变量扩展"
它有什么用???
作者: tbs198400     时间: 2007-6-17 11:04
呵呵,楼主一不小心就急我之所急了。太精彩了。
作者: lxmxn     时间: 2007-6-17 13:30
RE bd123456789:

1、pause>nul 的效果和单独的 pause 命令的效果一样,只是没有显示“请按任意键继续. . .”的字样,这里是>nul的作用,具体分析可以搜索一下论坛相关的讨论贴子。

2、参考下面两个链接:
[原创]变量延迟详解(新手推荐)
http://www.cn-dos.net/forum/viewthread.php?tid=28273&fpage=1

什么情况下该使用变量延迟?
http://www.cn-dos.net/forum/viewthread.php?tid=20733&fpage=1
作者: bd123456789     时间: 2007-6-24 07:08
呵呵,实用
非常感谢!
作者: vk     时间: 2007-6-24 20:03
这东西灵的 已收藏 多谢LZ
作者: duanml     时间: 2007-6-24 23:29
对新人帮助很大啊~
作者: redrains     时间: 2007-9-28 11:54
真是强贴
作者: ylgzs     时间: 2007-10-9 02:43
楼主真是一位好的引导老师啊,多写点啊。。。(别拍偶。。。。呵呵)
作者: james168     时间: 2007-10-9 10:19
学习了。
谢谢lxmxn!!!
作者: 06403213     时间: 2007-10-20 02:05
还可以这样传递啊!!!
作者: fengjian     时间: 2007-10-31 18:06
请容许我发表一个很低级得问题
版主 看了你得很多帖子 心里只有2个字“佩服”

我是刚刚才接触 这类东西 有很多不明白 就比你刚刚发的这个 我演示过了
但是看不明白什么意思 希望你们不要见笑  
我真的希望在今后的学习中能得到大家的帮助

谢谢
作者: lxmxn     时间: 2007-10-31 18:26


  Quote:
Originally posted by fengjian at 2007-10-31 18:06:
请容许我发表一个很低级得问题
版主 看了你得很多帖子 心里只有2个字“佩服”

我是刚刚才接触 这类东西 有很多不明白 就比你刚刚发的这个 我演 ...

其实这个变量截取就相当于其它语言里面的substr函数一样,可以截取一个字符串中指定位置的子串。

比如一个字符串的前两位是你想要的,那么就可以用变量截取来获得你想要的字符串。

比如
set string=cn.sina.com
set new=%string:~0,2%
那么%new%的值就是%string%的前两个字符了,即“cn”。
作者: z310394543     时间: 2007-11-4 00:46
for /l %%a in (1,3,15) do (
    for /l %%b in (1,4,15) do (
        call :printf %%a %%b
    )
)
能不能解释下(1,3,15)   和(1,4,15) 是控制什么的么?
作者: z310394543     时间: 2007-11-4 00:49
接上面   
貌似
set var=0123456789ABCDEF
这个变量下面的FOR没用到他的值?
不懂哎 ~~
作者: lxmxn     时间: 2007-11-4 09:59
RE z310394543:

1、(1,3,15) 是控制for循环中的变量 %%i 的,表示一个等差数列,即从1开始,以3为步长增长的数列,但数最大为15。

2、var 这个变量在 call 子过程中用到了,可以搜索一下论坛关于 call 用法的例子。
作者: z310394543     时间: 2007-11-4 20:58
斑竹的效率真高
作者: jk328019419     时间: 2007-11-9 20:10
根本没讲用法,会的还是会,不会的还是不会
作者: ThinKing     时间: 2007-11-9 20:17


  Quote:
Originally posted by jk328019419 at 2007-11-9 08:10 PM:
根本没讲用法,会的还是会,不会的还是不会

自己不动脑筋思考,永远也不会。
作者: wenjiech     时间: 2007-11-18 15:18
怎么下不了啊
作者: lxmxn     时间: 2007-11-18 20:15


  Quote:
Originally posted by wenjiech at 2007-11-18 15:18:
怎么下不了啊

论坛的存附件的空间被人破坏了,直接复制代码保存吧。
作者: zdzzdz1821     时间: 2007-11-21 19:22
hao dd
作者: xiaoqiang527     时间: 2007-12-14 11:11
支持下。我刚刚喜欢上批处理!
作者: ILoveDosoo1     时间: 2007-12-14 13:57
good就是good!
作者: moniuming     时间: 2007-12-31 00:49
对我的帮助实在是太大了,非常感谢!
作者: gne     时间: 2007-12-31 19:48
没明白干什么的
作者: riversail     时间: 2008-1-9 23:09
原来批处理还有如此细致的功能
作者: wxcute     时间: 2008-1-20 09:43
call :printf  %%a %%b

这句不太明白,请问后面的 %%a %%b 起到什么作用?

还有
echo. 是不是和 echo\ 一样都是换行的意思?

[ Last edited by wxcute on 2008-1-20 at 10:51 AM ]
作者: jinde22     时间: 2008-1-22 23:16
%%a %%b 是变量, 依次附给 %%1 %%2 把


谢谢.楼主.
作者: 313885174     时间: 2008-1-26 12:34
很好啊
作者: dslz666     时间: 2008-2-20 19:10
我是超级菜鸟,,这个也看不懂,,汗
作者: windowsxphao     时间: 2008-2-21 10:44
好东西,感谢,学习ing
作者: diangongban     时间: 2008-2-23 20:50
Getstr.rar不能下!!
作者: lxmxn     时间: 2008-2-23 22:29


  Quote:
Originally posted by diangongban at 2008-2-23 20:50:
Getstr.rar不能下!!

论坛的上传空间出现点问题导致的,直接复制代码是一样的。
作者: oszero     时间: 2008-3-13 11:53
多谢了,对我等新手的帮助实在太大了
作者: nipo     时间: 2008-4-27 03:26
这个要好好学学。
作者: nipo     时间: 2008-4-27 03:26
这个要好好学学。
作者: cheng342709     时间: 2008-4-27 14:27
真是受益匪浅啊!  …………~  
我是新手,希望多出好贴~
作者: wfy150     时间: 2008-5-3 02:11    标题: 谢谢斑竹

能请斑竹帮我详细讲解下关于FOR的/R /F /D /L 的使用方法讲解下吗!我看了很多这样的就是不知所云?越看越迷糊希望斑竹点拨下 新人
作者: wfy150     时间: 2008-5-3 02:19    标题: 再次感谢斑竹

又看了一边BAT文件里的东东觉得通俗易懂真是太谢谢斑竹了
作者: a346869208     时间: 2008-5-5 08:30
我都不知道怎么用哈
作者: taqiao     时间: 2008-5-18 11:21
谢谢
作者: hansom     时间: 2008-5-25 20:42
矛塞顿开
作者: wgx1688     时间: 2008-7-11 13:50
还是没怎么看的懂~
作者: wgx1688     时间: 2008-7-11 13:50
还是没怎么看的懂~
作者: scriptfresh     时间: 2008-8-20 19:41
学习了,呵呵
作者: BC     时间: 2008-8-21 21:46
不错。。。
作者: BC     时间: 2008-8-21 21:46
不错。。。
作者: slw218856     时间: 2008-8-28 19:29
学习中,能遇上自己能接受了的东西
那种感觉是perfect
谢了
作者: airstop     时间: 2008-9-8 20:30
好的,谢谢,学习了
作者: lingkong     时间: 2008-9-27 19:02
看来有很多东西要学啊。
作者: cysky     时间: 2008-10-7 13:26
下载来看看,好长时间没有认真地学习过了,
作者: aihejiating     时间: 2008-10-20 12:38
lxmxn版主,你可以尝试着用word编辑,用word上面的标尺来定位,这样就可以整齐地输出了
作者: wzhh1982     时间: 2008-10-28 22:27
顿时豁然开朗 感激不尽
授人于渔者 可敬!
作者: lfzmx     时间: 2008-11-5 14:54    标题: [CMD]理解变量字符的截取功能

板主真是強人!我頂....!!!!!
不過我還是得虛心學習.....
有些還是看不懂....
我想問個問題:
能否用批處理DOS命令每月建立一次當月的資料夾?
謝謝
作者: HAT     时间: 2008-11-5 18:03    标题: Re 98楼

有问题请单独发帖提问,你在别人的帖子里面跟帖提问的话,很少有人能看到你的问题,愿意回答问题的就更少了。
作者: biscuit     时间: 2008-11-20 21:02
谢谢LZ~我会好好学习的~
作者: YoDe     时间: 2008-12-5 16:02
lxmxn版主的帖子对我等新人帮助太大了!谢谢 辛苦了
作者: netbenton     时间: 2009-1-7 00:03
太强了
对我的帮助太大了
我会因此爱上批处理