Board logo

标题: 判断输入的文件名是否合法的批处理 [打印本页]

作者: namejm     时间: 2007-5-28 22:08    标题: 判断输入的文件名是否合法的批处理

  在很多时候,我们需要在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 ]
作者: qzwqzw     时间: 2007-5-29 19:57
不支持引号真是太遗憾了
"filename"都通不过
为什么呢?

而且说是创建文件
结果创建的是文件夹
似乎有些区别吧
作者: vkill     时间: 2007-5-29 20:26
...........

[ Last edited by vkill on 2007-5-29 at 08:30 PM ]
作者: namejm     时间: 2007-5-29 20:27


  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 ]
作者: qzwqzw     时间: 2007-5-29 22:20
那么直接拖进去的带空格文件名呢?
还要我手工删除前后的引号吗?
况且引号处理起来也不算很复杂

可以将处理引号的句子也放在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
作者: namejm     时间: 2007-5-29 23:06
  1、忘记说了,写这个代码的本意是演示如何判断输入的文件名是否合法,并没有考虑到使用上的方便,所以,不对完整路径做判断,换而言之,只判断文件名而不考虑路径。若要判断路径的话,就得重写代码了;

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

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