中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已完善]对文件夹下的快捷方式提取到桌面
作者:
标题: [已完善]对文件夹下的快捷方式提取到桌面 上一主题 | 下一主题
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『楼 主』:  [已完善]对文件夹下的快捷方式提取到桌面

已经完工,请大家测试效果多提建议,谢谢

已经有类似的批处理了,但我认为在规划时就建好快捷方式会方便很多,可以改中文快捷名,程序也不用太复杂,值得推广。

工作过程:    将目录下的子目录进行/s查找出所有lnk和url文件
    对每个lnk文件分析是否快捷方式在本目录,如果不是则重建(这是为了减少目录被分类时移动到其他地方造成的错误)
    每个快捷方式前面有“快捷方式”字样或后面有“.exe”字样均删除
    进入相应的目录,检查是否有“注册”“绿化”“安装”字样的文件并执行
    发送快捷方式到桌面

@echo off
cls
echo.
echo.
echo  *****************************************************************************
echo  *                                                                           *
echo  *  批量跑快捷.cmd 9z于2008.3.26                  http://693985.qzone.qq.com *
echo  *                                                                           *
echo  *  目的: 自动查找出文件夹下所有子文件夹里的快捷方式并建立到到桌面,是绿色软  *
echo  *  件爱好者和电脑公司必备工具, 经常整理软件的个人用户使用起来更是方便。     *
echo  *                                                                           *
echo  *  使用方法: 把所需要处理的文件夹拖到这个程序上面,或者直接在文件中定义文件 *
echo  *           夹,打开文件编辑filetmp变量,默认为当前文件夹                     *
echo  *                                                                           *
echo  *  要求: 1. 用户事先把每个软件在相应目录下都建立一次快捷方式,如果今后这个目 *
echo  *           录被更改了位置,批处理将自动生成新的快捷方式                     *
echo  *        2. 用户对要注册绿化类的软件建立名字要包含有"注册,绿化,安装,汉化,设 *
echo  *           置,破解"字样的批处理、执行文件或注册表文件                      *
echo  *                                                                           *
echo  *****************************************************************************
set desk=C:\Documents and Settings\All Users\桌面
rem 不想使用查找注册文件功能请把上面这句桌面位置更改为“set desk=nul\"
set filetmp=%cd%
if /i "%cd%" neq "c:\" goto BEGIN
if exist f:\tools\nul set filetmp=f:\tools
if exist e:\tools\nul set filetmp=e:\tools
if exist d:\tools\nul set filetmp=d:\tools

:BEGIN
rem 工作流程:
rem     将目录下的子目录进行/s查找出所有lnk和url文件
rem     对找到的每个文件进入到相应文件夹,如果快捷方式正好指向本文件夹,直接复制到桌面,否则查找其
rem     指向的执行文件,如果本目录里有这个执行文件,则重建快捷方式并发送桌面,没有或指向的是网站则什么都不做。
rem     基本可以使用了,但还有注册功能、空格和一些不规则目录或文件名部分没有完善。


echo.
echo.
echo.
if "%1" gtr "" set filetmp="%1"
call %filetmp:~0,2%
cd %filetmp%
setlocal enabledelayedexpansion
echo 请耐心等待遍历%cd%,根据目录大小硬盘灯亮完开始闪就快了.....

:BEGIN
for /f "delims=" %%i in ('dir *.lnk *.url /s /b') do (
   del c:\tmp.log >nul 2>nul
   set filetmp=%%~nxi&&set j=
   rem 上面一句取得tools下每一文件快捷方式文件路径+文件名,路径=%%~dpi,文件名=%%~nxi
   cd "%%~dpi"
   find /i /c "%%~dpi" "%%~nxi">nul&&echo ..!filetmp!&&copy "!filetmp!" "C:\Documents and Settings\All Users\桌面\">nul || (
        find /i /c "http://" "!filetmp!">nul||echo ok>c:\tmp.log
        )
   if exist c:\tmp.log for /f "delims=" %%j in ('find ":" "!filetmp!" ^|findstr /r "^[A-z]:[\\]"') do set j=%%~nxj&&echo !j!>c:\tmp.log
   if exist !j! (
        set filetmp=!filetmp:~0,-4!.url &&rem 把扩展名换成.url,有些快捷方式被改成中文,所以保持原名
        echo :::LNK路径不对,在桌面另生成:!filetmp!
        rem 以下几句生成url文件
        (echo [InternetShortcut] && echo URL=File:///%%~dpi!j! && echo WorkingDirectory=%%~dpi
        echo ShowCommand= && echo IconFile=%%~dpi!j! && echo IconIndex=^0 && echo HotKey=)>"C:\Documents and Settings\All Users\桌面\!filetmp!"
        )
   if exist "%desk%\!filetmp!" (
        set j=!filetmp:.exe=!
        set j=!j:快捷方式=!
        if "!filetmp!" neq "!j!" if exist "%desk%\!j!" del "%desk%\!j!"
        ren "%desk%\!filetmp!" "!j!"
        set filetmp=
        for /f "delims=" %%j in ('dir *set*.reg *set*.cmd *set*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *reg*.reg *reg*.cmd *reg*.exe *reg*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *汉化*.reg *汉化*.cmd *汉化*.exe *汉化*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *设置*.reg *设置*.cmd *设置*.exe *设置*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *注册*.reg *注册*.cmd *注册*.exe *注册*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *绿化*.reg *绿化*.cmd *绿化*.exe *绿化*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *安装*.reg *安装*.cmd *安装*.exe *安装*.bat /b 2^>nul') do set filetmp=%%j
        for /f "delims=" %%j in ('dir *破解*.reg *破解*.cmd *破解*.exe *破解*.bat /b 2^>nul') do set filetmp=%%j
        if "!filetmp:un=!" gtr "!filetmp!" (set filetmp=) else (if "!filetmp:卸=!" gtr "!filetmp!" set filetmp=)
        if "!filetmp!" gtr "" echo -----找到并注册:!cd!\的"!filetmp!"&&if /i "!filetmp:~-3!"=="reg" (call regedit /s !filetmp!
           ) else (
           echo 正在更名,^!!filetmp!,!filetmp! > nul 1>nul 2>nul
           ren "^!!filetmp!" "!filetmp!" > nul 1>nul 2>nul
           echo >tmp.bat rem for 去掉文件中的pause
           for /f "eol=; tokens=*" %%j in (!filetmp!) do if /i "%%j" neq "pause" echo %%j>>tmp.bat
           set filetmp="!cd!"
           call tmp.bat
           cd !filetmp!&&del tmp.bat&&color 07&&echo off

           )
        )
   )
)
:\
:END
del c:\tmp.log >nul 2>nul
echo.
echo.
echo 任务完成,按任意键退出...........
pause >nul

[ Last edited by 9zhmke on 2008-3-25 at 12:51 PM ]

2008-3-22 02:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 2 楼』:  

初略看了下,理解的不是很到位啊:

查看快捷方式所指的路径可以用find "盘符:\" *.lnk|find /v "-"

还有楼主启用了延迟变量但没出现!的应用.将for与if句括号里的%?%换成!?!试试.



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-3-22 03:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『第 3 楼』:  

谢谢指教,但换成了!?!还是不行啊,比如说用cd 那句,换成cd !paths!也是不能成的。
查看快捷方式我还没有验证,只是前面就没对,没法往下面写了。我想也是延迟变量的问题,但不知道该怎么下手。

[ Last edited by 9zhmke on 2008-3-22 at 04:02 AM ]

2008-3-22 04:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 4 楼』:  

和楼主比我真是个新人,指教真是不敢当...
---------------------------------------------
rem         setlocal enabledelayedexpansion
换成
setlocal enabledelayedexpansion
再将cd %%p~dpi
换成cd !paths!
试试
-----------------------------------------
cd %%p~dpi
这句?是笔误吧?
应该是cd %%~dpi

[ Last edited by plp626 on 2008-3-22 at 04:27 AM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-3-22 04:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『第 5 楼』:  

换了,那个%%p是不小心打错了。
用cd %%~dpi可以进,但cd !paths!不能进,cd %paths%也不能进,还是在原地没动,通过调试后知道一点了,在这里用了cd后,如果退出批处理,会被退到原文件夹下,也就是说当时已经进了这个目录了....继续改动....整体可以基本看到我的思路了,到时候再加入其他功能,但是一调试,居然出了个“此时不应有 )。”真是莫名其妙,再次昏死。
看来是for和if里不能嵌入goto,没办法,只有展开了,但是展开后居然又出了个不可思议的错误!

echo off
d:
rem del "C:\Documents and Settings\All Users\桌面\*.lnk"
rem del "C:\Documents and Settings\All Users\桌面\*.url"
cd\tools
set filetmp=
set i=
set j=
setlocal enabledelayedexpansion
cls

:BEGIN
for /f "delims=" %%i in ('dir *.lnk *.url /s /b') do (
        rem 上面一句取得tools下每一文件快捷方式文件路径+文件名,路径=%%~dpi,文件名=%%~nxi
        set filetmp=%%i
        cd %%~dpi
        rem 上面一句进到目录中,下面一句查看lnk文件中是否有本文件夹的快捷路径,如果有会返回0就直接跳到COPYFILE复制文件
        find %%~nxi /c /i "%%~dpi"
        if %errorlevel%==0 (
                copy !filetmp! "C:\Documents and Settings\All Users\桌面\"
                if %%~nxi==kl.url goto :eof &&在这里,一个网站的url文件通过了!经测试在文件夹内用find没找到字串的确返回的是1,这个网站的URL里怎么可能通过find %%~nxi /c /i "%%~dpi"?
界面里出现的内容:

---------- 360SAFE.EXE.LNK: 1
已复制         1 个文件。

---------- 美案方案书制作.LNK: 1
已复制         1 个文件。

---------- KL.URL: 0
已复制         1 个文件。

D:\Tools>



                ) else (
                echo 找到的文件没对头
                goto :eof
                find %%i /c /i "http://"
                rem 如果是1则是网站广告,就不管了
                       if "%errorlevel%"=="0" goto :eof&&rem call :MAKEURL %%i
                )
        )
goto END
:MAKEURL
        rem 下面找出快捷指向且只抽取出文件名,如果这个执行文件不存在就直接跳过复制到NOCOPY
        for /f "delims=" %%j in ('find ":" "%%1" ^|findstr /r "^[A-z]:[\\]"') do (
                set filetmp=%%1
                if not exist %%~nxj goto NOCOPY
                echo %%1快捷方式文件中路径不正确,正在更正&&rem 下面一句把扩展名换成.url,有些快捷方式被改成中文,所以保持原名
                set filetmp=%%filetmp:~0,-4%.url
                rem 以下几句生成url文件
                        (echo [InternetShortcut]
                               echo URL=File:///%%~dpi%%~dpj
                        echo WorkingDirectory=%%~dpi
                        echo ShowCommand=
                        echo IconFile=%%~dpi%%~dpj
                        echo IconIndex=^0
                        echo HotKey=)>"!filetmp!"
                )
        copy !filetmp! "C:\Documents and Settings\All Users\桌面\"

:END

[ Last edited by 9zhmke on 2008-3-22 at 06:20 PM ]

2008-3-22 13:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『第 6 楼』:  

....继续,前面部分对了,就差对错误路径的揪正了,又遇到个难题

echo off
d:
del "C:\Documents and Settings\All Users\桌面\*.lnk"
del "C:\Documents and Settings\All Users\桌面\*.url"
cd\tools
set filetmp=
set find=
set i=
set j=
setlocal enabledelayedexpansion
cls

:BEGIN
for /f "delims=" %%i in ('dir *.lnk *.url /s /b') do (
        rem 上面一句取得tools下每一文件快捷方式文件路径+文件名,路径=%%~dpi,文件名=%%~nxi
        set filetmp=%%i
        cd %%~dpi
        rem 上面一句进到目录中,下面一句查看lnk文件中是否有本文件夹的快捷路径,如果有会返回0就直接跳到COPYFILE复制文件
        for /f "delims=" %%j in ('find %%~nxi /c /i "%%~dpi"') do set find=%%j
        set find=!find:~-1!
        if !find! gtr 0 (
                echo 正在复制!filetmp!
                copy !filetmp! "C:\Documents and Settings\All Users\桌面\"
                ) else (
                echo 找到的文件没对头:%%~nxi
                for /f "delims=" %%j in ('find !filetmp! /c /i "http://"') do set find=%%j
                set find=!find:~-1!
                rem 如果是1则是网站广告就不管了,不是再花工夫去找
                if !find! equ 0  call :MAKEURL
                )
        )
goto END
:MAKEURL
rem 下面找出快捷指向且只抽取出文件名,如果这个执行文件不存在就直接跳过复制到NOCOPY
find ":" !filetmp!|findstr /r "^[A-z]:[\\]"
上面这句得出的结果后下面这句得出的结果不一样?

Nero.lnk里指向原来的目录是:D:\Tools\_常用关联软件\Nero\NeroPortable.exe(正确结果)

而下面的%%j居然得出了:=---------- D:\TOOLS\_常用关联软件\NERO7\NERO.LNK(是现在新的目录里的快捷名)


for /f "delims=" %%j in ('find ":" !filetmp!^|findstr /r "^[A-z]:[\\]"') do (
                echo %%j
pause
                if not exist %%~nxj goto NOCOPY
                echo %%j快捷方式文件中路径不正确,正在更正&&rem 下面一句把扩展名换成.url,有些快捷方式被改成中文,所以保持原名
                set filetmp=!filetmp:~0,-4!.url
                echo 新生成的文件是:!filtmp!
                rem 以下几句生成url文件
                        (echo [InternetShortcut]
                               echo URL=File:///%%~dpi%%~dpj
                        echo WorkingDirectory=%%~dpi
                        echo ShowCommand=
                        echo IconFile=%%~dpi%%~dpj
                        echo IconIndex=^0
                        echo HotKey=)>"!filetmp!"
                )
        copy !filetmp! "C:\Documents and Settings\All Users\桌面\"

:END

[ Last edited by 9zhmke on 2008-3-22 at 06:39 PM ]

2008-3-22 15:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『第 7 楼』:  

拦路虎,惹不起我躲还不行么,绕个弯,妈的还有问题:



echo off
d:
del "C:\Documents and Settings\All Users\桌面\*.lnk"
del "C:\Documents and Settings\All Users\桌面\*.url"
cd\tools
set filetmp=
set i=
set j=
set k=
set cp=
setlocal enabledelayedexpansion
cls

:BEGIN
for /f "delims=" %%i in ('dir *.lnk *.url /s /b') do (
        del c:\tmp.log >nul 2>nul
        set filetmp=%%i&&set j=&&set cp=
        rem 上面一句取得tools下每一文件快捷方式文件路径+文件名,路径=%%~dpi,文件名=%%~nxi
        cd %%~dpi
        rem 上面一句进到目录中,下面一句查看lnk文件中是否有本文件夹的快捷路径,如果有会返回0就直接跳到COPYFILE复制文件
       
        find %%~nxi /c /i "%%~dpi"&&set cp=1&&copy !filetmp! "C:\Documents and Settings\All Users\桌面\" || (
                find !filetmp! /c /i "http://"&&echo 不复制网站广告||echo ok&&echo ok>c:\tmp.log)
        if exist c:\tmp.log for /f "delims=" %%j in ('find ":" !filetmp! ^|findstr /r "^[A-z]:[\\]"') do set j=%%j&&echo !j!>c:\tmp.log
echo j=!j!
上一句变量都没问题,下面这句却无法执行,真是)(*&^%$#@!~
        if exist !j! echo ooook&&(
                echo %%k快捷方式文件中路径不正确,正在更正&&rem 下面一句把扩展名换成.url,有些快捷方式被改成中文,所以保持原名
                set filetmp=!filetmp:~0,-4!.url
                echo 新生成的文件是:!filtmp!
                rem 以下几句生成url文件
                       (echo [InternetShortcut]
                  echo URL=File:///%%~dpi%%~dpj
                 echo WorkingDirectory=%%~dpi
                 echo ShowCommand=
                 echo IconFile=%%~dpi%%~dpj
                 echo IconIndex=^0
                  echo HotKey=)>"!filetmp!"
                goto :eof
                )

        )
)
:END

[ Last edited by 9zhmke on 2008-3-23 at 02:10 AM ]

2008-3-23 02:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『第 8 楼』:  

终于基本完成,但还没有完善有些空格会有故障的问题。程序段在第一贴。

2008-3-23 02:46
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
9zhmke
中级用户




积分 355
发帖 99
注册 2003-1-6
状态 离线
『第 9 楼』:  

在find 中把文件和字串搞返了也可以成功,但会造成兼容性问题,以后大家不要步我后尘啊,费了好多功夫才查出来,字串必须写前面,文件名放到后面去。

请朋友们指正下吧,没什么大问题了

[ Last edited by 9zhmke on 2008-3-23 at 05:51 PM ]

2008-3-23 15:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: