中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-01 17:00
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何对用户的输入进行预处理? 查看 1,041 回复 5
楼 主 如何对用户的输入进行预处理? 发表于 2006-06-06 11:37 ·  中国 北京 联通
初级用户
积分 124
发帖 34
注册 2006-05-23 11:38
20年会员
UID 55845
状态 离线
如下的一个要求:

用户要求输入一个路径,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 发表于 2006-06-06 12:23 ·  中国 北京 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
20年会员
UID 43784
来自 北京
状态 离线
楼主好像很不小心,你第一个变量定义的是\err.log,而你输入的路径是c:\utility\这本来就有两个\\符号,当然路径就显示 c:\utility\\err.log了,如果你的第一个变量是ERR.LOG或者你输入的路径是C:\UTILITY应该就不会出现\\这个符号了 .......
3 发表于 2006-06-06 18:35 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re wingofsea:

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

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

for %%p in ("%installoc%%log%") do set a_path=%%~p
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
4 发表于 2006-06-08 10:59 ·  中国 北京 联通
初级用户
积分 124
发帖 34
注册 2006-05-23 11:38
20年会员
UID 55845
状态 离线
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 发表于 2006-06-08 11:41 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
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
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
6 发表于 2006-06-10 09:14 ·  中国 辽宁 大连 电信
初级用户
积分 110
发帖 27
注册 2006-06-03 17:25
20年会员
UID 56491
状态 离线
直接用一个if not exist "%a_path%\"来判断目录是否存在,不存在就是输错了,跳回去重输
xp,cmd
论坛跳转: