中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 判断输入的文件名是否合法的批处理
作者:
标题: 判断输入的文件名是否合法的批处理 上一主题 | 下一主题
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『楼 主』:  判断输入的文件名是否合法的批处理

  在很多时候,我们需要在CMD窗口中手动输入文件名来创建文件,比如本人曾经做过的 文件备份器 ,这个时候,往往需要对输入的字符串做非法字符的检测。但是,不能做文件名的字符是如此之多:有各种控制符号、/、\、>、<、"、系统设备保留字符(如nul、com1等)……若用穷举法的话,姑且不论CMD特殊字符的处理是何等地让人绞尽脑汁,光是那一大堆非法字符,恐怕没人能轻易地全部罗列出来,基于对特殊字符的头痛及挂一漏万的担忧,以前一直没找到一个合适的方案,现在得以有闲,写了段代码,用于演示检测被当作文件名输入的字符串是否含有非法字符,发出来让大家讨论一下:
@echo off
:: 思路:在系统临时目录下创建随机文件,把检测非法字符的任务交给操作系统来完成
:: Thanks to qzwqzw

:main
cls
set input=
set /p input=  请输入文件名:
call :check
pause
goto main

:check
set "str1=%input:"=%"
set "str2=%input:"= %"
if not "%str1%"=="%str2%" goto main
:loop
set rnd=%random%
if exist "%tmp%\%input%%rnd%" goto loop
cd.>"%tmp%\%input%%rnd%" 2>nul || goto main
del /q "%tmp%\%input%%rnd%"
echo "%input%" 是合法的文件名
goto :eof
[ Last edited by namejm on 2007-5-29 at 11:28 PM ]

   此帖被 +16 点积分      点击查看详情   
评分人:【 youxi01 分数: +8  时间:2007-5-28 22:43
评分人:【 lxmxn 分数: +8  时间:2007-5-28 23:00




尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-5-28 22:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 2 楼』:  

不支持引号真是太遗憾了
"filename"都通不过
为什么呢?

而且说是创建文件
结果创建的是文件夹
似乎有些区别吧

2007-5-29 19:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





积分 4103
发帖 1744
注册 2006-1-20
来自 甘肃.临泽
状态 离线
『第 3 楼』:  

...........

[ Last edited by vkill on 2007-5-29 at 08:30 PM ]

2007-5-29 20:26
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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



  Quote:
Originally posted by qzwqzw at 2007-5-29 19:57:
不支持引号真是太遗憾了
"filename"都通不过
为什么呢?

而且说是创建文件
结果创建的是文件夹
似乎有些区别吧

  引号不能作为文件(夹)的名啊,所以"filename"不能通过。

  呵呵,XP系统下,文件夹名和文件名的命名规则应该一致的吧?当时没仔细思考,顺手就写了个创建文件夹的代码,我还是改成创建随机文件的代码吧。

[ Last edited by namejm on 2007-5-29 at 08:48 PM ]



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-5-29 20:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qzwqzw
银牌会员

天的白色影子


积分 2342
发帖 635
注册 2004-3-6
状态 离线
『第 5 楼』:  

那么直接拖进去的带空格文件名呢?
还要我手工删除前后的引号吗?
况且引号处理起来也不算很复杂

可以将处理引号的句子也放在check中
因为都是与check有关的

另外,这一句搞得那么别扭

cd.>"%tmp%\%input%%rnd%" 2>nul && (
    del /q "%tmp%\%input%%rnd%"
) || (
    goto main
)

直接这样不省事省心吗?

cd.>"%tmp%\%input%%rnd%" 2>nul || goto main
del /q "%tmp%\%input%%rnd%"

-------------------------------

其它的问题
发现cd、echo等出错之后并不返回errorleve
也不设置%errorlevel%l
但是用&&、||仍然有效
看来cmd用了另外的通讯机制

echo.>"%tmp%\%input%%rnd%" & echo %errorlevel%
cd.>"%tmp%\%input%%rnd%" & if not errorlevel 1 echo 0

2007-5-29 22:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


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

  1、忘记说了,写这个代码的本意是演示如何判断输入的文件名是否合法,并没有考虑到使用上的方便,所以,不对完整路径做判断,换而言之,只判断文件名而不考虑路径。若要判断路径的话,就得重写代码了;

  2、判断引号的语句确实应该放到:check标签段中去,这样就得多写一个标签符号了,嘿嘿,为了节省这个标签,我把它放前面去了,恩,马上改过来;

  3、&&和||的复合语句看起来确实别扭,就照 qzwqzw 兄说的办。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2007-5-29 23:06
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: