中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 如何实现用右键菜单调用bat文件完成移动文件的功能
« [1] [2] [3] »
作者:
标题: 如何实现用右键菜单调用bat文件完成移动文件的功能 上一主题 | 下一主题
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 16 楼』:  



  Quote:
Originally posted by pinghu at 2008-2-5 21:48:
看来各位还未重视我的帖子,我想是因为大家认为难就难在重命名上面,移动文件看起来很容易,等你亲自测试的时候就会发现,当选中若干文件时, ...


@echo off
    call :%* 2>nul || goto setup
goto :eof

:Sub1
rem 移动到父目录
    set "str=%~nx1"

    :loop
        if not exist "..\%str%" goto Next
        set "str=%~n1_New%~x1"
    goto loop

    :Next
        move "%~nx1" "..\%str%"
goto :eof

:Sub2
rem 脱壳
rem 自己完成
goto :eof

:setup
    reg add "hkcr\*\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub1 \"%%1\""
    reg add "hkcr\Folder\shell\脱壳\command" /f /t reg_sz /v "" /d "\"%~0\" Sub2 \"%%1\""
goto :eof
上面只是个演示脚本,双击后就可自动安装了。
注意setup部分只在文件上面添加"移动至父目录"功能,并未对文件夹做处理,这个可以自己添加.
另外,上面的脚本也没有对同时选中多个文件的同步问题进行处理,可能导致会出现同名覆盖的问题,对于这种情况,可以适当地利用临时文件设置一下标识,使每个实例运行的时候能根据情况决定是否拷贝。例如可以向某个文件中写入当前处理的文件名,记得用覆盖模式,然后延时一段时间,接着读取标志文件,文件名对应得到的就执行移动工作,移动完后更改标志文件,对不上的则继续等待.继续查询标志文件。...
用纯粹的bat来完成真的是没多大意义,如果可能,我建议你还是尝试一下vbs,会简单得多。
另外给你几个链接可能有用:
[原创]SendTo+批处理实用小工具--加强版发送到
查找电脑中,所有的bat文件,并复制到当前目录?
批处理如何添加右键菜单?
SendTo+(VBS版)

2008-2-6 12:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 17 楼』:  

上面的*我用的是 AllFileSystemObject

2008-2-6 12:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 18 楼』:  

问题得到初步解决,可以松一口气了!
感谢3742668的支持,我从中学习了sub1和reg add 和设置str变量的用法
ありがとございます!!

2008-2-6 15:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 19 楼』:  

3742668的脚本运行时有个问题
假设我选的文件名为1.txt,往上移动,上级目录出现了一个1.txt文件
我重建1.txt文件,再往上移动,上级目录出现了1_New.txt文件
我再次新建1.txt文件,再往上移动,失败!!

2008-2-6 18:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 20 楼』:  

确切的说是进入死循环了

2008-2-6 18:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 21 楼』:  

我把代码改进了一下,解决了死循环
@echo off
    call :%* 2>nul || goto setup
goto :eof

:Sub1
rem 移动到父目录
    set "str=%~nx1"
    set /a counter=1
    :loop
        if not exist "..\%str%" goto Next
        set "str=%~n1_New%counter%%~x1"
        set /a counter+=1
    goto loop

    :Next
        set /a counter=
        move "%~nx1" "..\%str%"
goto :eof

:Sub2
rem 脱壳
rem 自己完成
goto :eof

:setup
    reg add "hkcr\*\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub1 \"%%1\""
    reg add "hkcr\Folder\shell\脱壳\command" /f /t reg_sz /v "" /d "\"%~0\" Sub2 \"%%1\""
goto :eof
可遇到文件夹怎么办呢?

2008-2-6 18:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vkill
金牌会员





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

加右键也只是单文件可以用

2008-2-6 21:15
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 23 楼』:  大侠帮忙看看,sub2部分哪里语法不对

@echo off
    call :%* 2>nul || goto setup
goto :eof

:Sub1
rem 移动到父目录
    set "str=%~nx1"
    set /a counter=1
    :loop
        if not exist "..\%str%" goto Next
        set "str=%~n1_New%counter%%~x1"
        set /a counter+=1
    goto loop

    :Next
        set /a counter=
        move "%~nx1" "..\%str%"
goto :eof

:Sub2
rem 脱壳
    setlocal enabledelayedexpansion
    set /a counter=1
    cd /d "%1"

    for /f "delims=" %%i in (*.*) do (
        if not exist "..\%%~nxi" goto Next
    :loop
        set "str=%%~ni_New!counter!%%~xi"
        set /a counter+=1
        if not exist "..\!str!" goto Next  

    goto loop

    :Next
        if "!counter!" equ "1" (move "%%i" "..\%%~nxi") else move "%%i" "..\!str!"
        set /a counter=1)
    set counter=
    goto :eof

:setup
    reg add "hkcr\*\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub1 \"%%1\""
    reg add "hkcr\directory\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub1 \"%%1\""
    reg add "hkcr\directory\shell\脱壳\command" /f /t reg_sz /v "" /d "\"%~0\" Sub2 \"%%1\""
goto :eof
经测试,sub1的功能可以支持到所有选定的文件和文件夹,并保证重命名的可靠性,只是sub2还有不对的地方,望大家帮忙
到底错在哪里呢,我写这个sub2头都大了,望大家挑错

2008-2-6 21:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 24 楼』:  

发现标签重名,改正后sub2仍然不能使用,通知我不知道用什么方式打开,郁闷了

2008-2-7 02:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 25 楼』:  

既然有sub1了,何必还要重写那么多代码呢?
还是建议用vbs或者其他更严谨的脚本来实现。

[ Last edited by 3742668 on 2008-2-7 at 01:26 PM ]

2008-2-7 02:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 26 楼』:  

vbs 我不会,直会用批处理,楼上的脚本经测试,两个功能都不行啊,怎么回事
到底我写的Sub2错哪了

2008-2-7 12:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 27 楼』:  

Sorry,由于没有测试环境,所以25楼的代码中有不少错误,包括逻辑上的错误以及语法上的错误。
呵呵,太久没写过了,手都生了。试试下面这个:
@echo off
    call :%* 2>nul || goto setup
goto :eof

:Sub1
rem 移动到父目录   
        if not defined str set "str=%~nx1"
        if not exist "..\%~nx1" (move "%str%" "..\%~nx1" && set "str=" && goto :eof)
        call :Sub1 "%~n1_New%~x1"
goto :eof

:Sub2
rem 脱壳
    pushd "%~1"
    for %%i in (*.*) do call :Sub1 "%%~dpnxi"
    popd
    rd "%~1"
goto :eof


:setup
    reg add "hkcr\*\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub1 \"%%1\""
    reg add "hkcr\Folder\shell\脱壳\command" /f /t reg_sz /v "" /d "\"%~0\" Sub2 \"%%1\""
goto :eof
建议一次性大批量选定操作目标测试一下,看看是否会存在同步方面的问题。另外可以在move后面加上写入日志的功能。

   此帖被 +3 点积分       点击查看详情   
评分人:【 pinghu 分数: +3  时间:2008-2-13 13:25


2008-2-7 13:07
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 28 楼』:  

反复试验了几次发现“移动到父目录”功能能支持到所有文件和文件夹
“脱壳”功能只能应用到所选文件夹里的文件,无法应用到所选文件夹里的文件夹

2008-2-7 17:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pinghu
中级用户





积分 307
发帖 130
注册 2008-2-1
状态 离线
『第 29 楼』:  

上述代码加上
reg add "hkcr\Folder\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub2 \"%%1\""
方能移动目录

2008-2-7 18:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 30 楼』:  



  Quote:
Originally posted by pinghu at 2008-2-7 17:13:
反复试验了几次发现“移动到父目录”功能能支持到所有文件和文件夹
“脱壳”功能只能应用到所选文件夹里的文件,无法应用到所选文件夹里的文件夹

我只负责给你提示和框架,具体首尾还是根据你自己的想法自己写吧。例如如上面提到过的,建议你加上日志功能,多试试特大数量的操作等等。
另外,如果想是脱壳功能应用到文件夹,可以自己尝试用dir /b来解决。

建议你自己从头到尾按照自己的想法重新自己写一遍,那样才能有收获,这也就是论坛的意义所在了。

2008-2-7 19:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: