中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-23 17:58
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,274 会员排行
DOS批处理 & 脚本技术(批处理室) » 如何对用户的输入进行预处理?
可打印版本  1,167 / 5
第1楼 wingofsea 发表于 2006-06-06 11:37
初级用户 发帖 34 积分 124
如何对用户的输入进行预处理?
如下的一个要求:

用户要求输入一个路径,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,

谢谢,学习中....
第2楼 bagpipe 发表于 2006-06-06 12:23
银牌会员 发帖 425 积分 1,144 来自 北京
楼主好像很不小心,你第一个变量定义的是\err.log,而你输入的路径是c:\utility\这本来就有两个\\符号,当然路径就显示 c:\utility\\err.log了,如果你的第一个变量是ERR.LOG或者你输入的路径是C:\UTILITY应该就不会出现\\这个符号了 .......
第3楼 willsort 发表于 2006-06-06 18:35
元老会员 发帖 1,512 积分 4,432
Re wingofsea:

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

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

for %%p in ("%installoc%%log%") do set a_path=%%~p
第4楼 wingofsea 发表于 2006-06-08 10:59
初级用户 发帖 34 积分 124
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
第5楼 willsort 发表于 2006-06-08 11:41
元老会员 发帖 1,512 积分 4,432
Re wingofsea:

抱歉!

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

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

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

如何从用户传入的参数中去掉引号?
http://www.cn-dos.net/forum/viewthread.php?tid=20838
第6楼 wentimao 发表于 2006-06-10 09:14
初级用户 发帖 27 积分 110
直接用一个if not exist "%a_path%\"来判断目录是否存在,不存在就是输错了,跳回去重输
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023