标题: 如何实现用右键菜单调用bat文件完成移动文件的功能
[打印本页]
作者: pinghu
时间: 2008-2-4 16:51
标题: 如何实现用右键菜单调用bat文件完成移动文件的功能
功能1:当鼠标右键选中若干个文件和文件夹时,右键菜单中出现“移动至父目录”命令,执行的结果为将选中的文件和文件夹移动至父目录。如存在文件重名现象就自动重命名
功能2:当鼠标右键选中若干个文件夹时,右键菜单中出现“脱壳”命令,执行的结果为将选定文件夹中的所有内容移动至当前目录然后删除所选文件夹。如存在文件重名现象就自动重命名
我用的是xp,这两个功能如果能实现的话是很有用的。问题有些难,还望大家研究研究!
如果能写出bat单文件实现这两个功能那我会佩服的五体投地,单文件实现不了的话。用bat和reg组合起来也不错啊。有劳大家了
作者: slore
时间: 2008-2-4 17:37
重命名麻烦点。。。移动不难。
作者: pinghu
时间: 2008-2-5 11:14
难就难在若何保证重命名后又不至于和其他文件重名是吗
作者: 3742668
时间: 2008-2-5 11:41
单个文件实现并不难,只不过体力活都懒得去做而已。
建议你学习一下 无奈何 的sendto+,以及本版多次讨论过的 右键菜单 的问题,应该很简单就能实现。
作者: pinghu
时间: 2008-2-5 19:31
楼上说的帖子我找不着啊,哪位能给个引用地址
作者: pinghu
时间: 2008-2-5 19:49
假设我选定文件的时候
用%1表示该文件,用cd %~dp1命令进入该文件夹,接下来我用xcopy /s/q/-y %1 ..\复制文件的时候出现找不到文件的情况怎么处理呢?
作者: slore
时间: 2008-2-5 19:55
为什么不用move?
你的文件路径是不是有空格?
作者: pinghu
时间: 2008-2-5 20:17
对啊,有空格
作者: pinghu
时间: 2008-2-5 20:20
我只会用xcopy加rd,move怎么加参数表示指定路径下所有文件和文件夹呢
作者: slore
时间: 2008-2-5 20:35
应该是*.*
有空格你要引起来……
在你脚本不要直接执行,最好先echo看看。。。
作者: pinghu
时间: 2008-2-5 20:57
选定文件的时候调用%1却返回空值,为什么啊。郁闷啊,不能给全代码,至少给点提示啊
作者: pinghu
时间: 2008-2-5 21:48
看来各位还未重视我的帖子,我想是因为大家认为难就难在重命名上面,移动文件看起来很容易,等你亲自测试的时候就会发现,当选中若干文件时,在注册表命令行中调用一个bat文件,bat不知道你选的文件是什么,%1在这里不起作用。你就没办法继续下去。有意思的是当选定目录时%1却可以返回当前路径,也就是说,第二个功能实现起来要比第一个功能容易(暂时不考虑重命名)如果问题换成“在右键菜单中加入cmd或者格式化什么的,我也不用大费周章的来这里提问了
作者: pinghu
时间: 2008-2-5 22:17
问题不解决之前,我不想让帖子沉下去,解决问题的同时也会得到其中的乐趣啊
作者: slore
时间: 2008-2-5 22:36

作者: slore
时间: 2008-2-5 22:39
临时用空间上传了下。
不能看到图的话,我在找找地址好了……
论坛的上传系统太郁闷了~~
作者: 3742668
时间: 2008-2-6 12:44
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版)
作者: slore
时间: 2008-2-6 12:54
上面的*我用的是 AllFileSystemObject
作者: pinghu
时间: 2008-2-6 15:06
问题得到初步解决,可以松一口气了!
感谢3742668的支持,我从中学习了sub1和reg add 和设置str变量的用法
ありがとございます!!
作者: pinghu
时间: 2008-2-6 18:10
3742668的脚本运行时有个问题
假设我选的文件名为1.txt,往上移动,上级目录出现了一个1.txt文件
我重建1.txt文件,再往上移动,上级目录出现了1_New.txt文件
我再次新建1.txt文件,再往上移动,失败!!
作者: pinghu
时间: 2008-2-6 18:24
确切的说是进入死循环了
作者: pinghu
时间: 2008-2-6 18:42
我把代码改进了一下,解决了死循环
@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
可遇到文件夹怎么办呢?
作者: vkill
时间: 2008-2-6 21:15
加右键也只是单文件可以用
作者: pinghu
时间: 2008-2-6 21:54
标题: 大侠帮忙看看,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头都大了,望大家挑错
作者: pinghu
时间: 2008-2-7 02:16
发现标签重名,改正后sub2仍然不能使用,通知我不知道用什么方式打开,郁闷了
作者: 3742668
时间: 2008-2-7 02:33
既然有sub1了,何必还要重写那么多代码呢?
还是建议用vbs或者其他更严谨的脚本来实现。
[
Last edited by 3742668 on 2008-2-7 at 01:26 PM ]
作者: pinghu
时间: 2008-2-7 12:28
vbs 我不会,直会用批处理,楼上的脚本经测试,两个功能都不行啊,怎么回事
到底我写的Sub2错哪了
作者: 3742668
时间: 2008-2-7 13:07
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后面加上写入日志的功能。
作者: pinghu
时间: 2008-2-7 17:13
反复试验了几次发现“移动到父目录”功能能支持到所有文件和文件夹
“脱壳”功能只能应用到所选文件夹里的文件,无法应用到所选文件夹里的文件夹
作者: pinghu
时间: 2008-2-7 18:32
上述代码加上
reg add "hkcr\Folder\shell\移至父目录\command" /f /t reg_sz /v "" /d "\"%~0\" Sub2 \"%%1\""
方能移动目录
作者: 3742668
时间: 2008-2-7 19:00
Quote: |
Originally posted by pinghu at 2008-2-7 17:13:
反复试验了几次发现“移动到父目录”功能能支持到所有文件和文件夹
“脱壳”功能只能应用到所选文件夹里的文件,无法应用到所选文件夹里的文件夹 |
|
我只负责给你提示和框架,具体首尾还是根据你自己的想法自己写吧。例如如上面提到过的,建议你加上日志功能,多试试特大数量的操作等等。
另外,如果想是脱壳功能应用到文件夹,可以自己尝试用dir /b来解决。
建议你自己从头到尾按照自己的想法重新自己写一遍,那样才能有收获,这也就是论坛的意义所在了。
作者: pinghu
时间: 2008-2-7 23:46
Quote: |
Originally posted by slore at 2008-2-6 12:54 PM:
上面的*我用的是 AllFileSystemObject |
|
17楼说的正确,如果用*表示应用到文件,要想应用到文件夹要用或者folder,却不能同时用directory和folder。用AllFileSystemObject可以应用到文件和文件夹
注册表真是挑剔啊,既要保证功能全面又要保证键值的功能没有冗余和重叠!
call :sub1 “%%~dpnxi”这行中的“%%~dpnxi”是格式上是什么参数,起什么作用??
作者: pinghu
时间: 2008-2-7 23:51
楼上说的日志功能我也完全不会弄,我太菜了,
我写出来的东西还有许多语法上的错误,对批处理的语法也不熟悉
比如在for 语句的作用范围内跳转标签能否被识别?
作者: pinghu
时间: 2008-2-8 00:00
为什么直接选中文件夹能实现上移,选中文件夹就不能实现呢,同样是盗用sub1啊,头疼
作者: pinghu
时间: 2008-2-8 11:36
我用了楼上说的’dir /b ' 结果成功了,能脱壳文件和文件夹,大功告成,学到不少东西,再把完整的批处理贴一次,以供大家使用
安装程序
@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 脱壳
cd "%~1"
for /f "delims=" %%i in ('dir /b') do call :Sub1 "%%~dpnxi"
goto :eof
:setup
reg add "hkcr\AllFilesystemObjects\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
卸载程序
reg delete "hkcr\directory\shell\脱壳" /f
reg delete "hkcr\AllFilesystemObjects\shell\移至父目录" /f
作者: 3742668
时间: 2008-2-8 12:16
Very Good!
不过,只是dir /b是无法拷贝隐藏文件的,另外卸载部分何不放在setup里面呢?在里面判断是否有相关的注册表项目,然后决定是安装还是卸载。
最重要的一点是在这个帖子里你收获到了多少?能否完全不看参考,仅凭思路来写有自己风格的代码?
例如你在前面12F提到过的问题究竟产生的原因是什么?注册表中的值的内容和批处理之间有什么联系?为什么有的地方要加引号,有的不用?
你可以自己尝试解决这些问题,如果有什么不明白的可以跟贴寻求提示。
作者: pinghu
时间: 2008-2-8 13:34
@echo off
call :%* 2>nul || goto choice
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 /f "delims=" %%i in ('dir /a /b') do call :Sub1 "%%~dpnxi"
popd
rd "%~1"
goto :eof
:choice
set /p dd=安装A,卸载X,退出T:
if "%dd%"=="a" goto setup
if "%dd%"=="A" goto setup
if "%dd%"=="x" goto unistall
if "%dd%"=="X" goto unistall
if "%dd%"=="t" goto :eof
if "%dd%"=="T" (goto :eof) else echo 重新输入 &goto choice
goto :eof
:setup
reg add "hkcr\AllFilesystemObjects\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
:unistall
reg delete "hkcr\directory\shell\脱壳" /f
reg delete "hkcr\AllFilesystemObjects\shell\移至父目录" /f
goto :eof
这回把卸载也加进去了,还在dir 中加入了/a参数
我到现在也不知道本文中call 的用法,还有%1是如何在注册表和批处理中传递的
作者: pinghu
时间: 2008-2-8 13:41
加了dir /a /b 还是不能移动隐藏文件
作者: pinghu
时间: 2008-2-8 13:50
if "%dd%"=="a" goto setup
if "%dd%"=="A" goto setup两句能否写成一句呢
作者: slore
时间: 2008-2-8 15:59
多看 /?
作者: pinghu
时间: 2008-2-8 17:17
想通了一个问题
在运行批处理文件时可以加参数
在call 标签调用子程序时同样可以加参数
作者: pinghu
时间: 2008-2-8 17:23
新手学习的一个重要问题
看来 /? 以后 对应用命令的格式不熟悉
比如
if "%dd%"=="a" goto setup
if "%dd%"=="A" goto setup两句能否写成一句呢
这个问题
我使用if "%dd%"=="a" ^| "%dd%"=="A" goto setup
语法不对啊
作者: pinghu
时间: 2008-2-8 18:00
到底有没有不带赋值功能的逻辑运算符?楼上的问题可以用/i 参数解决
能不能用一个语句判断dd的值等于a b c其中之一就满足条件的
作者: 3742668
时间: 2008-2-8 18:22
:choice
set /p dd=安装A,卸载X,退出T:
call :%dd% || (echo error! && goto choice)
goto :eof
:a
:A
reg .....
goto :eof
:x
:X
reg .....
goto :eof
为什么还要交互呢?
在setup里面先测试注册表里面是否有安装信息,若有则自动卸载,若无则自动安装,结构上应该更加清晰明了一些。
作者: pinghu
时间: 2008-2-9 12:42
感谢3742668
的大力支持,如果你不帮我写的话,我是写不出来的,总之大功告成!比我预期的效果还要好!!再次感谢3742668!!