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
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
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
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
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
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
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
Originally posted by jk328019419 at 2007-11-9 08:10 PM:
根本没讲用法,会的还是会,不会的还是不会

自己不动脑筋思考,永远也不会。

作者: wenjiech     时间: 2007-11-18 15:18
怎么下不了啊

作者: lxmxn     时间: 2007-11-18 20:15
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
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
太强了
对我的帮助太大了
我会因此爱上批处理