标题: [已解决][求助]碰到含有特殊字符的文件夹咋办?
[打印本页]
作者: nickwu
时间: 2010-6-1 11:06
标题: [已解决][求助]碰到含有特殊字符的文件夹咋办?
最近写了个批处理
因为是无聊时的产物,所以程序也挺无聊的~~
不过无聊归无聊,实用性倒是有一点
话说一个人要在当前目录下创建文件副本最少要调用几次命令?答案是两次(复制and粘贴)
但是自从哥们有了这个批处理之hou,腰也不疼le,腿也不抽筋了,嘿,效果还真不错,最起码可以给你鼠标长长寿

呵呵,以上是玩笑话,下面进入正题,我发此贴的目的有两个:
第一,资源(代码)共享,如果觉得此程序有用,不妨将代码拷下来以备用
第二,因为目前发现程序有些漏洞,所以想请这里的高手们帮忙完善完善,算是技术交流吧(PS:现在很兴这个词,我也来赶赶潮流。。)
下面贴出代码:
::此程序用来快速创建文件或文件夹的副本,省去复制粘贴两步操作
@echo off
set path=%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem
:star
if "%~1" == "" goto :EOF
if not exist "%~1" echo 路径错误!&pause&exit
set t=0
::判断是否为目录
cd /d "%~1" 2>nul
if ERRORLEVEL 1 (
call :file "%~1"
)else (
call :folder "%~1"
)
shift
goto star
::处理文件
:file
pushd "%~dp1"
set /a "t+=1"
if exist "%~n1_%t%%~x1" (popd&goto file)
copy "%~nx1" "%~n1_%t%%~x1" /y >nul
POPD
goto :EOF
::处理文件夹
:folder
pushd "%~dp1"
set /a "t+=1"
if exist "%~nx1_%t%" (popd&goto folder)
echo "%~nx1_%t%"&pause
xcopy /s /e /r /h /y "%~n1" "%~n1_%t%\" >nul 2>nul
POPD
goto :EOF
以上代码的使用方法是保存以上代码为“副本.bat”,然后将文件放到系统“SendTo”即“发送到”菜单,一般此路径为"C:\Documents and Settings\Administrator\SendTo",这里顺便提醒一点,这个路径是可以通过修改注册表或是使用某些软件进行自定义的
下面我说一下目前所发现的程序漏洞:当传递给程序的文件夹参数中含有特殊字符如^或%等,程序运行后无任何反应,即是程序失效。当然这个漏洞我是通过一个貌似有点无赖的行为检测出来的,就是手动建一个名为"!~@# ¥%&()^"的文件夹(

这种文件夹够损的吧!能用到的特殊字符都用到了

,虽是少见,但也不排除这种可能~~这也是我们这些编写程序的人该有的品质——做到"尽善尽美"

如果哪位同胞对上面的代码有更好的建议,麻烦提出来,大家一起交流~~
另外,因为我还是一个论坛新手,所以这里的很多帖子没看过,不知道我提的问题有没重复,所以如果哪位同胞发现此贴有重复嫌疑的话,帮忙提醒一下,如果证实有重复,我希望可以自行申请将此贴删去
[
Last edited by nickwu on 2010-6-1 at 16:02 ]
作者: nickwu
时间: 2010-6-1 15:54
标题: 事情总会水落石出
自己弄了一个下午,没想到竟然给弄明白了
最后发现是自己写的代码有个画蛇添足的地方
下面我贴出正确的代码
::此程序用来快速创建文件或文件夹的副本,省去复制粘贴两步操作
@echo off
set path=%SystemRoot%;%SystemRoot%\system32;%SystemRoot%\System32\Wbem
:star
if "%~1" == "" goto :EOF
if not exist "%~1" echo 路径错误!&pause&exit
set t=0
::判断是否为目录
cd /d "%~1" 2>nul
if ERRORLEVEL 1 (
pushd "%~dp1"
set /a "t+=1"
if exist "%~n1_%t%%~x1" (popd&goto file)
copy "%~nx1" "%~n1_%t%%~x1" /y >nul
POPD
)else (
pushd "%~dp1"
set /a "t+=1"
if exist "%~nx1_%t%" (popd&goto folder)
xcopy /s /e /r /h /y "%~n1" "%~n1_%t%\" >nul 2>nul
POPD
)
shift
goto star
为了更好的理解,我还另外写了个演示:
::功能:此程序用来演示不同场合参数格式化的区别,它告诉我们:在批处理里面,为了提高程序的兼容性,能不用子函数的地方尽量不用
::用法:新建一个名为“~!@# $%^&”的文件夹,然后将其鼠标左键按住拖到此程序图标上运行即可
@echo off
if not "%~1"=="" echo "%~n1"
set a="~!@# $%^&"
echo "%a:"=%"
call :folder "%a:"=%"
goto :EOF
:folder
echo "%~n1"
pause
goto :EOF