标题: 如何对用户的输入进行预处理?
[打印本页]
作者: wingofsea
时间: 2006-6-6 11:37
标题: 如何对用户的输入进行预处理?
如下的一个要求:
用户要求输入一个路径,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,
谢谢,学习中....
作者: bagpipe
时间: 2006-6-6 12:23
楼主好像很不小心,你第一个变量定义的是\err.log,而你输入的路径是c:\utility\这本来就有两个\\符号,当然路径就显示 c:\utility\\err.log了,如果你的第一个变量是ERR.LOG或者你输入的路径是C:\UTILITY应该就不会出现\\这个符号了 .......
作者: willsort
时间: 2006-6-6 18:35
Re wingofsea:
首先,在CMD中,“\\”是有效的,与“\”基本等同,所以通常不需要“预处理”。
其次,如果需要预处理,可以使用for语句,如下:
for %%p in ("%installoc%%log%") do set a_path=%%~p
作者: wingofsea
时间: 2006-6-8 10:59
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
作者: willsort
时间: 2006-6-8 11:41
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
作者: wentimao
时间: 2006-6-10 09:14
直接用一个if not exist "%a_path%\"来判断目录是否存在,不存在就是输错了,跳回去重输