中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 解析某个字符串,并输出分隔后的各子字符串
作者:
标题: 解析某个字符串,并输出分隔后的各子字符串 上一主题 | 下一主题
qdcr
初级用户





积分 120
发帖 32
注册 2006-6-19
状态 离线
『楼 主』:  解析某个字符串,并输出分隔后的各子字符串

请教大家:
如下的一个功能需求:
解析字符串: 
QQ,c:\program files\QQ|MSN,c:\program files\MSN|messager,c:\program files\messager

以"|"字符作为分隔符,分隔后的字符:
QQ,c:\program files\QQ

MSN,c:\program files\MSN

messager,c:\program files\messager

我的问题:
set V_productInstalloc="QQ,c:\program files\QQ|MSN,c:\program files\MSN|messager,c:\program files\messager"
for /f "tokens=1,2 delims=|" %%i in ("%V_productInstalloc%") do (
echo %%i
)
在V_productInstalloc中保存的工具名及其安装目录数不定,上例中为3个,而要想将每个子串都进行输出的话,需要用:
echo %%i
echo %%j
echo %%k
矛盾在于,这里必须明确知道子串的个数。
请问:如何输出字符串 V_productInstalloc(子串个数不定)的每一个子串?
谢谢

2006-6-30 15:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  在CMD中,不能解析某些特定的符号,比如管道符号|、重定向符号>、>>等,所以,你的代码运行的时候会出错,不知道你是不是真正地测试过了。所以,建议用其他符号分隔字符串。

  暂时还没想到解决的办法,期待高手出招。

2006-6-30 23:01
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  想起在弄我的文件备份器的时候,对输入的日期进行判断的需求和本例有相似之处,稍加修改后能顺利解决楼主的问题,前提是要对分隔符号作改动。本例中把分隔符号设置为斜杠符号"/":
@echo off
set V_productInstalloc=QQ,c:\program files\QQ/MSN,c:\program files\MSN/messager,c:\program files\messager
call :check
:loop
set V_productInstalloc=%V_productInstalloc:*/=%
:check
for /f "tokens=1 delims=/" %%i in ("%V_productInstalloc%") do (echo %%i)
echo "%V_productInstalloc%"|find /i "/">nul 2>nul && goto loop
pause


2006-6-30 23:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 4 楼』:  


@echo off
    set str="QQ,c:\program files\QQ|MSN,c:\program files\MSN|messager,c:\program files\messager"
    set str=%str:|=" "%
    call :print %str%
    pause
goto :eof

:print
    for %%i in (%*) do echo %%~i
goto :eof
在写批处理脚本的时候,尽量养成能用引号就用引号的习惯。因为对付无处不在的特殊字符,空格,比较有效的方法就是用引号包起来。

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

batch fan


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

  版主高明,pf。

  能不能把for %%i in (%*) do echo %%~i中的%*符号讲一下,一直弄不明白这两个符号表达的意思是什么。

2006-7-1 10:07
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wydos
中级用户





积分 304
发帖 117
注册 2006-4-4
状态 离线
『第 6 楼』:  

call帮助中有介绍:
C:\Documents and Settings\lzy>call/?
从批处理程序调用另一个批处理程序。

CALL [drive:][path]filename [batch-parameters]

  batch-parameters   指定批处理程序所需的命令行信息。

如果命令扩展名被启用,CALL 会如下改变:

CALL 命令现在将卷标当作 CALL 的目标接受。语法是:

    CALL:label arguments

一个新的批文件上下文由指定的参数所创建,控制在卷标被指定
后传递到语句。您必须通过达到批脚本文件末两次来 "exit" 两次。
第一次读到文件末时,控制会回到 CALL 语句的紧后面。第二次
会退出批脚本。键入 GOTO /?,参看 GOTO  : EOF  扩展名的描述,
此描述允许您从一个批脚本返回。

另外,批脚本文本参数参照(%0、%1、等等)已如下改变:


     批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)

     批参数(%n)的替代已被增强。您可以使用以下语法:

         %~1         - 删除引号("),扩充 %1
         %~f1        - 将 %1 扩充到一个完全合格的路径名
         %~d1        - 仅将 %1 扩充到一个驱动器号
         %~p1        - 仅将 %1 扩充到一个路径
         %~n1        - 仅将 %1 扩充到一个文件名
         %~x1        - 仅将 %1 扩充到一个文件扩展名
         %~s1        - 扩充的路径指含有短名
         %~a1        - 将 %1 扩充到文件属性
         %~t1        - 将 %1 扩充到文件的日期/时间
         %~z1        - 将 %1 扩充到文件的大小
         %~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
                       扩充到找到的第一个完全合格的名称。如果环境
                       变量名未被定义,或者没有找到文件,此组合键会
                       扩充到空字符串

    可以组合修定符来取得多重结果:

        %~dp1       - 只将 %1 扩展到驱动器号和路径
        %~nx1       - 只将 %1 扩展到文件名和扩展名
        %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
                       并扩展到找到的第一个文件的驱动器号和路径。
        %~ftza1     - 将 %1 扩展到类似 DIR 的输出行。

    在上面的例子中,%1 和 PATH 可以被其他有效数值替换。
    %~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*
    使用

2006-7-1 10:56
查看资料  发送邮件  发短消息 网志  OICQ (327337973)  编辑帖子  回复  引用回复
feifei0000
初级用户





积分 42
发帖 11
注册 2006-1-7
状态 离线
『第 7 楼』:  

请问一下楼住,echo "%V_productInstalloc%"|find /i "/">nul 2>nul 是具体什么意思,尤其是 2>nul 为什么会有这个,这个有什么作用????

2006-7-8 17:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slam
新手上路





积分 18
发帖 7
注册 2007-6-30
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by 3742668 at 2006-7-1 09:56 AM:
[code]
@echo off
    set str="QQ,c:\program files\QQ|MSN,c:\program files\MSN|messager,c:\program files\messager"
    set str=%str:|=" "%
    call :print %str%
    pause
g ...

请问这个代码里的set str=%str:|=" "%
是什么意思?

2007-7-5 16:52
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: