中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何对用户的输入进行预处理?
作者:
标题: 如何对用户的输入进行预处理? 上一主题 | 下一主题
wingofsea
初级用户





积分 124
发帖 34
注册 2006-5-23
状态 离线
『楼 主』:  如何对用户的输入进行预处理?

如下的一个要求:

用户要求输入一个路径,batch程序读取该路径,并与batch中定义的相对路径进行拼接,这样可能会遇到如下的问题:

@echo off
    set log=\err.log
    set /p installoc=please input the path of utility installation location:
    pushd %installoc% 2>nul
    popd
    set a_path=%installoc%%log%
   echo The path of log file is %a_path%

如果用户输入 c:\utility\,
则 a_path 为 c:\utility\\err.log, 请注意这里会有两个 \\, 如何规则这个绝对路径,输出为 c:\utility\err.log,

谢谢,学习中....

2006-6-6 11:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 2 楼』:  

楼主好像很不小心,你第一个变量定义的是\err.log,而你输入的路径是c:\utility\这本来就有两个\\符号,当然路径就显示 c:\utility\\err.log了,如果你的第一个变量是ERR.LOG或者你输入的路径是C:\UTILITY应该就不会出现\\这个符号了 .......

2006-6-6 12:23
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 3 楼』:  

Re wingofsea:

      首先,在CMD中,“\\”是有效的,与“\”基本等同,所以通常不需要“预处理”。

      其次,如果需要预处理,可以使用for语句,如下:

      for %%p in ("%installoc%%log%") do set a_path=%%~p



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-6 18:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wingofsea
初级用户





积分 124
发帖 34
注册 2006-5-23
状态 离线
『第 4 楼』:  

to bagpipe:
谢谢
首先,c:\utility\ 是由用户输入的,路径的输入是用户控制的,他可以输入 c:\utility\ 也可以输入c:\utility , 所以需要进行预处理。

to willsort:
谢谢,因为程序会将这个a_path输出到终端,如果用户看到 c:\utility\\err.log,会有点别扭,所以想进行规范化,用 您给的这条语句好像还是不行:

@echo off
    set log=\err.log
    set /p installoc=please input the path of utility installation location:
    pushd %installoc% 2>nul
    popd
    for %%p in ("%installoc%%log%") do set a_path=%%~p
    echo %a_path%
pause

2006-6-8 10:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 5 楼』:  

Re wingofsea:

      抱歉!

      事例代码中的可替换变量%%p少写了一个修饰字f,如下:
      for %%p in ("%installoc%%log%") do set a_path=%%~fp

      另外,用以下的方法可以仅替换 \\ 为 \ :
      set a_path=%installoc%%log%
      set a_path=%a_path:\\=\%

      但路径的规范化总是比我们想象的要复杂,尤其在这个路径是由用户自由输入的时候,有很多意外的情况。比如,路径中出现了非法字符,路径中同时含有空格和引号等等,这给我们的编码带来很多困难。如果你有深入的兴趣,可以参考以下信息:

[1]  [讨论]如何从用户传入的参数中去掉引号?   
http://www.cn-dos.net/forum/viewthread.php?tid=20838



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 11:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wentimao
初级用户





积分 110
发帖 27
注册 2006-6-3
状态 离线
『第 6 楼』:  

直接用一个if not exist "%a_path%\"来判断目录是否存在,不存在就是输错了,跳回去重输



xp,cmd
2006-6-10 09:14
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: