中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决][求助]碰到含有特殊字符的文件夹咋办?
作者:
标题: [已解决][求助]碰到含有特殊字符的文件夹咋办? 上一主题 | 下一主题
nickwu
新手上路





积分 8
发帖 8
注册 2010-5-31
状态 离线
『楼 主』:  [已解决][求助]碰到含有特殊字符的文件夹咋办?

最近写了个批处理
因为是无聊时的产物,所以程序也挺无聊的~~
不过无聊归无聊,实用性倒是有一点
话说一个人要在当前目录下创建文件副本最少要调用几次命令?答案是两次(复制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 ]

2010-6-1 11:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
nickwu
新手上路





积分 8
发帖 8
注册 2010-5-31
状态 离线
『第 2 楼』:  事情总会水落石出

自己弄了一个下午,没想到竟然给弄明白了
最后发现是自己写的代码有个画蛇添足的地方

下面我贴出正确的代码
::此程序用来快速创建文件或文件夹的副本,省去复制粘贴两步操作
@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


2010-6-1 15:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: