中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: 如何判断变量的长度?? 上一主题 | 下一主题
luxiaoming2001
新手上路





积分 16
发帖 5
注册 2006-11-15
状态 离线
『楼 主』:  如何判断变量的长度??

set dd=1234
我如何判断dd这个变量的长度??请高手指教

2006-11-15 09:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  以前 willsort 曾经写过这样的代码,发出来你琢磨一下:
@echo off & setlocal EnableDelayedExpansion
:begin
set mystr=
set /p mystr=输入要计算长度的字符串(直接回车退出):
if not defined mystr goto :eof
for /l %%i in (0,1,1000) do if "!mystr:~%%i,1!"=="" set strlen=%%i && goto :_endfor
:_endfor
::echo 字符串:  "%mystr%"
echo 长  度:  %strlen%
set strlen=
goto begin
  在这个代码的基础上,可以修改为:
@echo off
:begin
cls
set mystr=
set /p mystr=输入要计算长度的字符串(直接回车退出):
if not defined mystr goto :eof
set count=0
setlocal enabledelayedexpansion
:intercept
set /a count+=1
for /f %%i in ("%count%") do if not "!mystr:~%%i,1!"=="" goto intercept
echo 长  度:  %count%
pause
goto begin


   此帖被 +2 点积分     点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-21 04:35




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-15 10:09
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 3 楼』:  

其实问题并不像vkill兄说的那样简单, 这不单牵涉到引号配对的问题, 还有诸如控制字符等特殊符号的处理.

经过反复修改下面的代码已经可以处理特殊字符了, 测试暂时没发现错误.
@echo off

set /p str=请输入字符串:

set "str=%str:"= %"

:next

if not "%str%"=="" (

    set /a num+=1

    set "str=%str:~1%"

    goto next

)

echo 输入的字符数:%num%

pause
二楼的代码可以不用FOR语句来实现.
@echo off

set /p str=请输入字符串:

setlocal enabledelayedexpansion

if not defined str goto :eof

:next

if not "!str:~%num%,1!"=="" (

    set /a num+=1

    goto next

)

echo 输入的字符数:%num%

pause
[ Last edited by pengfei on 2006-11-20 at 11:10 AM ]



业精于勤而荒于嬉,形成于思而毁于随。
2006-11-15 10:18
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 4 楼』:  


  一下就有三种方法了,收藏一下。


2006-11-15 10:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
luxiaoming2001
新手上路





积分 16
发帖 5
注册 2006-11-15
状态 离线
『第 5 楼』:  

谢谢了,我马上去研究下,DOS的这种命令真是深奥啊,感觉没有SHELL的命令简洁

2006-11-15 22:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 6 楼』:  

我用的也是pengfei兄这样的方法

2006-11-16 03:50
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 7 楼』:  

  3F的代码也不失为一种好方法,只是因为 if not "%ii%"=="" 语句的限制,处理英文状态下的引号的时候会出错,如果字符串中可能存在英文状态下的引号的话,建议采用2F的代码。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-11-16 06:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by namejm at 2006-11-16 06:45:
  3F的代码也不失为一种好方法,只是因为 if not "%ii%"=="" 语句的限制,处理英文状态下的引号的时候会出错,如果字符串中可能存在蠮..

可以换个别的了,像 if not %ii%*==* ,当然也可以换个很特殊的,三种方法其实都是一种思路,呵呵

[ Last edited by vkill on 2006-11-16 at 07:05 AM ]

2006-11-16 07:03
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 9 楼』:  



  Quote:
Originally posted by vkill at 2006-11-16 07:03:

可以换个别的了,像 if not %ii%*==* ,当然也可以换个很特殊的,三种方法其实都是一种思路,呵呵

[ Last edited by vkill on 2006-11-16 at 07:05 AM ]

vkill兄这样处理遇到的问题会更多, 如果输入特殊字符就无法处理了.

其实这个错误是引号配对引起的, 我们可以先去掉引号再来判断, 代码更新在3楼.



业精于勤而荒于嬉,形成于思而毁于随。
2006-11-20 09:00
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 10 楼』:  


@echo off
set /p a=
echo :%a%>tmp.bat
echo set /a r=%%~z0-21>>tmp.bat
call tmp.bat
echo %r%
pause > nul
del tmp.bat
本人不擅长写批处理,大家多多批评哈

   此帖被 +2 点积分     点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-21 04:35





C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-11-20 09:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 11 楼』:  

electronixtar兄真不错啊, 想到利用文件大小来判断, 但这样依然存在特殊字符处理的问题. 如果输入管道命令就会出错.



业精于勤而荒于嬉,形成于思而毁于随。
2006-11-20 09:54
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 12 楼』:  

精彩~~
electronixtar兄的这个~z玩得可是真好玩~:)
欣赏!这方法虽 “另类” 但绝对让人眼前一亮~:)

而且写放tmp.bat文件后 “set /a r=%~z0-21” 本身占16个字符,
还有一个首行的 “:” 标签(这样用户输入的内容会被当做标签,哈哈),这个占1个字符,
还有echo写入时的多余的一行回车换行符2个,
和首行写入(所占的回车换行符)2 个,
一共是 21 ,
所以 %~z0(文件自身的长度)还要减去21就是刚被用户所输入的长度~:)
真是精心计算啊~:)

[ Last edited by redtek on 2006-11-19 at 09:27 PM ]



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-20 10:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wchy2006
新手上路





积分 2
发帖 1
注册 2006-10-25
来自 陕西省西安市
状态 离线
『第 13 楼』:  请教electronixtar:set /a r=%%~z0-21 是什么意思?

我刚开始学习批处理,对您帖子中的  set /a r=%%~z0-21  这行代码不明白,请指教,多谢拉!

2006-11-20 10:41
查看资料  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 14 楼』:  

其实偶没有考虑那么多。现随便减了个15,发现相差6,于是就减了个21,完毕。并没有精心计算。




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-11-20 10:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 15 楼』:  

利用文件大小判断字符数, 代码改进一下, 可处理特殊字符. 同时, 3楼的代码都已经通用, 目前测试暂时没有发现错误.
@echo off

set /p str=请输入字符串:

set "str=%str:"= %"

>str.txt set /p "auto=%str%"<nul

call :go str.txt

echo 输入的字符数:%size%

del str.txt

pause >nul

exit

:go

set size=%~z1

goto :eof
[ Last edited by pengfei on 2006-11-20 at 11:07 AM ]

   此帖被 +2 点积分     点击查看详情   
评分人:【 redtek 分数: +2  时间:2006-11-21 04:36




业精于勤而荒于嬉,形成于思而毁于随。
2006-11-20 10:50
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: