标题: [文本处理] BAT如何获取开始-程序里的快捷方式的起始位置? [打印本页]
作者: llqcnw 时间: 2013-9-2 17:02 标题: BAT如何获取开始-程序里的快捷方式的起始位置?
要实现的结果是:查找一个exe文件所在的文件夹位置,然后把几个文件复制进这个文件夹。
现在已经有批处理的代码实现了这个结果,但是执行时间太长,大致方法是在全部盘符里查找该exe文件,然后复制几个文件到这个exe文件所在的文件夹,但是全盘搜索无论是用for f 还是用for d的速度都慢,所以想用更快捷的方法来执行。
更快捷的思路是这个exe文件必定会在开始-程序里有个快捷方式(安装这个软件必然的结果,无论是安装到哪个目录里),所以想直接由这个快捷方式的起始位置来快速定位到exe文件所在的文件夹,这样就不用全盘搜索了,应该会节省时间吧,
但现在的问题是不知道怎么获取这个在开始-程序里的这个快捷方式的起始位置(不是这个快捷方式所在的文件夹的位置),在坛里搜了搜,看到有获取桌面快捷方式的起始位置的帖子,但试着改了改,执行后得不到我想要的结果,还请有高手帮忙给个代码,谢谢!
作者: 522235677 时间: 2013-9-2 17:47
你要说出是什么程序,或许会有更快的方法。
你这样说了一大堆还不是要找出快捷方式所在位置。
作者: DAIC 时间: 2013-9-2 17:48
能否分享一下这个链接?我想学习学习
作者: llqcnw 时间: 2013-9-2 19:02
回复 2# 522235677
1、那个exe是很少见的一种专业软件,无非就是个lnk,不用非要把文件名都列出来吧
2、不是要这个快捷方式的位置,是快捷方式的起始位置,如果是要获取快捷方式所在的位置,根本也不用批处理来做啦。
作者: llqcnw 时间: 2013-9-2 19:05
回复 3# DAIC
http://www.bathome.net/viewthrea ... C%BD%DD%B7%BD%CA%BD
另:使用搜索功能搜一下就搜到了
作者: 522235677 时间: 2013-9-2 19:12
回复 4# llqcnw
我的意思就是快捷方式指向的位置,只是不想说的那个明确。又不是我在提问
作者: DAIC 时间: 2013-9-2 19:31
回复 5# llqcnw
你是根据几楼的代码修改的?请把你修改之后未能得到正确结果的代码贴出来看看
作者: llqcnw 时间: 2013-9-2 20:18
回复 7# DAIC
@echo off
for /f "delims=" %%a in ('find /i ":" QQ游戏.lnk ^| findstr /i "^[a-z]:"') do set QQfull=%%a
echo %QQfull%
echo.&pause
这个是获取桌面快捷方式的起始位置的一段代码,
“qq游戏”是我改的
执行的结果是
找不到文件-qq游戏。lnk
echo处于关闭状态
请按任意键继续
作者: llqcnw 时间: 2013-9-2 20:20
本帖最后由 llqcnw 于 2013-9-2 20:22 编辑
回复 7# DAIC
这段代码是我搜索后看到的一个帖子里的
http://www.bathome.net/viewthrea ... C%BD%DD%B7%BD%CA%BD
这段代码我也试了,对于桌面的快捷方式不是都好用,有的桌面快捷方式好用,有的就不好用
好用的就显示出起始位置了,不好用的就是如上那样
作者: llqcnw 时间: 2013-9-2 20:23
回复 7# DAIC
关键是
'find /i ":" QQ游戏.lnk ^| findstr /i "^[a-z]:"'
不明白这段代码的意思,所以只能改个文件名试试
作者: DAIC 时间: 2013-9-2 20:47
回复 10# llqcnw 复制代码
意思是在QQ游戏.lnk这个文件里面查找包含冒号的行
你得保证.bat和QQ游戏.lnk放在同一个目录下面
作者: llqcnw 时间: 2013-9-2 20:55
回复 11# DAIC
在lnk里查找包含冒号的行 这个我知道,应该是找出路径的那一行吧(路径里 :\里包含冒号)
后面那个findstr语句是什么意思?
作者: DAIC 时间: 2013-9-2 21:25
回复 12# llqcnw
查找以字母a-z开头的后面跟着一个冒号的行
作者: llqcnw 时间: 2013-9-2 21:40
本帖最后由 llqcnw 于 2013-9-2 22:01 编辑
回复 13# DAIC
哦,那基本明白了,
还有个问题,如果lnk文件的文件名中包含。(点)或_(下划线)或 (空格)等的要怎么处理
以及bat文件和lnk文件不在同一目录中的处理方法
我用同样的代码在两个文件夹内试验,可结果却不一样(lnk文件名做了相应的更改)
C:\Documents and Settings\All Users\「开始」菜单\程序\迅雷软件\迅雷网游加速器 在这里执行的结果是路径
C:\Documents and Settings\All Users\「开始」菜单\程序\盛大网络\龙之谷 在这里执行的结果是“ECHO处于关闭状态”不显示路径
这是为什么?
作者: DAIC 时间: 2013-9-2 23:00
回复 14# llqcnw
还有个问题,如果lnk文件的文件名中包含。(点)或_(下划线)或 (空格)等的要怎么处理
8楼的代码可以处理这个情况。如果你遇到了无法处理的,请把结果贴出来看看。
以及bat文件和lnk文件不在同一目录中的处理方法
使用完整路径- find /i ":" "C:\test\QQ游戏.lnk"
复制代码
我用同样的代码在两个文件夹内试验,可结果却不一样(lnk文件名做了相应的更改)
- cd /d "C:\Documents and Settings\All Users\「开始」菜单\程序\盛大网络\龙之谷"
- dir
- find /i ":" *.lnk
复制代码
在CMD窗口手工依次执行上面的三个命令,把结果贴出来看看。
作者: llqcnw 时间: 2013-9-3 10:58
龙之谷在家里的电脑上, 单位电脑上没有,我在单位电脑上试了那段代码,也是有的快捷方式好用,有的不好用,我把不好用的(和龙之谷情况一样的)按照你说的把cmd的命令执行结果贴出来
作者: llqcnw 时间: 2013-9-3 10:59
回复 15# DAIC
执行结果如下:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>cd /d "C:\Documents and Settings\All Use
rs\「开始」菜单\程序\搜狗拼音输入法"
C:\Documents and Settings\All Users\「开始」菜单\程序\搜狗拼音输入法>dir
驱动器 C 中的卷没有标签。
卷的序列号是 48D6-C39A
C:\Documents and Settings\All Users\「开始」菜单\程序\搜狗拼音输入法 的目录
2013-03-22 12:15 <DIR> .
2013-03-22 12:15 <DIR> ..
2013-03-22 12:15 679 卸载.lnk
2013-03-22 12:15 1,681 扩展功能管理.lnk
2013-03-22 12:15 1,765 皮肤小盒子.lnk
2013-03-22 12:15 801 设置.lnk
2013-03-22 12:15 801 设置向导.lnk
2013-03-22 12:15 807 输入法管理器.lnk
2013-03-22 12:15 <DIR> 链接
6 个文件 6,534 字节
3 个目录 9,776,476,160 可用字节
C:\Documents and Settings\All Users\「开始」菜单\程序\搜狗拼音输入法>find /i ":"
*.lnk
---------- 卸载.LNK
/C:\
:
---------- 扩展功能管理.LNK
/C:\
:
:
:
---------- 皮肤小盒子.LNK
/C:\
:
:
:
---------- 设置.LNK
/C:\
:
:
---------- 设置向导.LNK
/C:\
:
:
---------- 输入法管理器.LNK
/C:\
:
:
C:\Documents and Settings\All Users\「开始」菜单\程序\搜狗拼音输入法>
作者: DAIC 时间: 2013-9-3 11:42
回复 17# llqcnw
你选择一个有问题的.lnk文件,比如:输入法管理器.LNK
1、右键单击,属性,看看里面有没有程序的完整路径。
2、在CMD窗口里面执行这个命令:复制代码
把结果贴出来看看
作者: llqcnw 时间: 2013-9-3 12:38
回复 18# DAIC
有完整的路径
目标:"C:\Program Files\sogoupinyin\SogouExe\SogouExe.exe" "c:\Program Files\sogoupinyin\6.5.0.9181\SGTool.exe" --appid=config /m
起始位置:"c:\Program Files\sogoupinyin\6.5.0.9181\SkinPreview"
作者: DAIC 时间: 2013-9-3 13:02
回复 19# llqcnw
你下载一个shortcut.exe试试它能否识别
http://www.bathome.net/thread-4020-1-1.html- shortcut.exe /f:"输入法管理器.LNK" /a:q
复制代码
作者: llqcnw 时间: 2013-9-3 13:18
回复 20# DAIC
C:\Documents and Settings\All Users\「开始」菜单\程序\搜狗拼音输入法>shortcut.ex
e /f:"输入法管理器.LNK" /a:q
[输入法管理器.LNK]
TargetPath=C:\Program Files\sogoupinyin\SogouExe\SogouExe.exe
TargetPathExpanded=C:\Program Files\sogoupinyin\SogouExe\SogouExe.exe
Arguments="c:\Program Files\sogoupinyin\6.5.0.9181\SGTool.exe" --appid=config /m
ArgumentsExpanded="c:\Program Files\sogoupinyin\6.5.0.9181\SGTool.exe" --appid=c
onfig /m
WorkingDirectory=c:\Program Files\sogoupinyin\6.5.0.9181\SkinPreview
WorkingDirectoryExpanded=c:\Program Files\sogoupinyin\6.5.0.9181\SkinPreview
RunStyle=1
IconLocation=,0
IconLocationExpanded=,0
HotKey=0 (None)
Description=
The command completed successfully.
C:\Documents and Settings\All Users\「开始」菜单\程序\搜狗拼音输入法>
作者: DAIC 时间: 2013-9-3 14:43
回复 21# llqcnw
开起来是可以识别的,还有其它问题吗?
作者: llqcnw 时间: 2013-9-3 20:05
本帖最后由 llqcnw 于 2013-9-3 20:28 编辑
回复 22# DAIC
但是执行代码后得到的结果是::
ECHO 处于关闭状态。
请按任意键继续. . .
没有得到路径啊?而有的快捷方式执行这段代码后得到的结果是:
C:\Program Files\Baofeng\StormPlayer\StormPlayer.exe
请按任意键继续. . .
(下午出门了,刚回来)
另外还有个问题,就是得到的结果是目标位置,而不是起始位置,即结果是包含有exe文件的一个链接,我想要的路径是到文件夹为止,不需要把文件名也列出来。
作者: DAIC 时间: 2013-9-4 16:59
你好,感谢这几天的耐心解答,不过现在问题没有解决,我做了测试,如果把快捷方式的起始位置的路径中的中文都改成英文,执行这段代码就能得到结果即快捷方式的目标位置的路径,请问有办法解决执行结果中的中文路径的问题吗?
你是说shortcut.exe无法支持中文路径是吗?
作者: DAIC 时间: 2013-9-4 17:01
回复 23# llqcnw
ECHO 处于关闭状态。
请按任意键继续. . .
你执行的哪个代码得到的这个结果?
作者: batman 时间: 2013-9-4 17:42
本帖最后由 batman 于 2013-9-4 17:45 编辑
给个示例,自己对着改吧。。。- @echo off
- set "folder=%userprofile%\「开始」菜单\程序\"
- for /f "delims=" %%a in ('dir /a-d /b /s "%folder%腾讯QQ.lnk"') do (
- for /f "delims=" %%b in ('type "%%a"^|find /i ".exe"') do set "getpath=%%~dpb"
- )
- echo,%getpath%
- pause>nul
复制代码
作者: llqcnw 时间: 2013-9-4 17:53
回复 26# batman
@echo off
for /f "delims=" %%a in ('find /i ":" QQ游戏.lnk ^| findstr /i "^[a-z]:"') do set QQfull=%%a
echo %QQfull%
echo.&pause
就是这段代码执行的结果,如果结果里有中文就显示 echo处于关闭状态, 如果结果中没有中文,就显示出路径了。
谢谢!我今晚试一下你给的这段代码
作者: terse 时间: 2013-9-4 18:09
本帖最后由 terse 于 2013-9-4 18:15 编辑
- @echo off
- for /f "delims=" %%a in ('more "狙击.jgs.lnk" ^| findstr /ib [a-z]:\\') do set "lnk=%%a"
- echo %lnk%
- pause
复制代码
d:\我的文档\军旗\明\junqi2012_2_16_23_5.jgs
请按任意键继续. . .- @echo off
- set "folder=%userprofile%\「开始」菜单\程序\"
- for /f "delims=" %%a in ('dir /b /a-d /s "%folder%\*.lnk"') do (
- for /f "delims=" %%b in ('more "%%a" ^| findstr /ib [a-z]:\\') do (
- echo "%%a" "%%b"
- )
- )
- pause
复制代码
作者: llqcnw 时间: 2013-9-4 20:27
本帖最后由 llqcnw 于 2013-9-4 20:40 编辑
回复 26# batman
真是见鬼啦
用你这段代码执行的结果是
系统找不到指定的文件。
请按任意键继续. . .
(我的腾讯QQ.lnk在C:\Documents and Settings\All Users\「开始」菜单\程序\腾讯软件\QQ2013文件夹里,
我把代码中的set "folder=%userprofile%\「开始」菜单\程序\" 改为 set "folder=%userprofile%\「开始」菜单\程序\腾讯软件\QQ2013\"
这样是对的吧? 但执行的结果就是这样。
晕,怎么 =%userprofile%变成是 C:\Documents and Settings\Administrator 不应该是C:\Documents and Settings\All Users 吗?
作者: llqcnw 时间: 2013-9-4 20:29
本帖最后由 llqcnw 于 2013-9-4 20:57 编辑
回复 28# terse
第二段代码应该是把目录里的所有lnk文件都显示出来,但是我有个目录里明明有两个lnk文件,但是就是显示不出来,用dir可以看到lnk文件,shortcut看也可以看到lnk文件的内容,
作者: batman 时间: 2013-9-4 20:54
回复 29# llqcnw
发现目录不对,自己修改吧,要不就用%userprofile%的上级目录,只是速度要慢点。。。
for /f "delims=" %%a in ("%userprofile%") do set "folder=%%~dpa"
作者: llqcnw 时间: 2013-9-4 21:12
回复 31# batman
这个我自己试验后明白了, 我就直接把 C:\Documents and Settings\All Users\「开始」菜单\程序 加到代码里了,不用变量了,
只是发生了灵异事件:
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\Administrator>cd\
C:\>cd /d C:\Documents and Settings\All Users\「开始」菜单\程序\防伪开票
C:\Documents and Settings\All Users\「开始」菜单\程序\防伪开票>dir
驱动器 C 中的卷没有标签。
卷的序列号是 D4DE-3282
C:\Documents and Settings\All Users\「开始」菜单\程序\防伪开票 的目录
2013-09-04 21:04 <DIR> .
2013-09-04 21:04 <DIR> ..
2005-07-04 01:11 57,344 Shortcut.exe
2013-09-04 20:41 284 新编.bat
2013-09-04 21:00 289 查找.bat
2013-09-02 19:39 315 防伪开票子系统6.0.lnk
2013-09-02 19:39 329 防伪开票软件升级.lnk
5 个文件 58,561 字节
2 个目录 13,606,887,424 可用字节
C:\Documents and Settings\All Users\「开始」菜单\程序\防伪开票>shortcut.exe /f:"
防伪开票子系统6.0.lnk" /a:q
[防伪开票子系统6.0.lnk]
TargetPath=E:\防伪开票\Bin\kp.exe
TargetPathExpanded=E:\防伪开票\Bin\kp.exe
Arguments=
ArgumentsExpanded=
WorkingDirectory=e:\防伪开票\Bin
WorkingDirectoryExpanded=e:\防伪开票\Bin
RunStyle=1
IconLocation=,0
IconLocationExpanded=,0
HotKey=0 (None)
Description=
The command completed successfully.
C:\Documents and Settings\All Users\「开始」菜单\程序\防伪开票>
这应该是有两个lnk文件吧,但是执行代码的结果就是什么都没有(用terse的第二段代码执行的结果是只有“按任意键继续”
@echo off
set "folder=C:\Documents and Settings\All Users\「开始」菜单\程序\防伪开票"
for /f "delims=" %%a in ('dir /b /a-d /s "%folder%\*.lnk"') do (
for /f "delims=" %%b in ('more "%%a" ^| findstr /ib [a-z]:\\') do (
echo "%%a" "%%b"
)
)
pause
作者: terse 时间: 2013-9-4 21:30
要排错的话 是否先直接 more "%%a" 这里 你先看有什么结果
或者 减少 findstr 搜索关键词看下
作者: hzcxdgioa 时间: 2013-11-28 23:51
看看究竟什么情况。。。。。。。
作者: ywxaoxiao 时间: 2014-5-23 19:00
1111木里的快捷方式的起始
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |