Board logo

标题: [文本处理] 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
  1. find /i ":" QQ游戏.lnk
复制代码
意思是在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文件不在同一目录中的处理方法

使用完整路径
  1. find /i ":" "C:\test\QQ游戏.lnk"
复制代码
我用同样的代码在两个文件夹内试验,可结果却不一样(lnk文件名做了相应的更改)
  1. cd /d "C:\Documents and Settings\All Users\「开始」菜单\程序\盛大网络\龙之谷"
  2. dir
  3. 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窗口里面执行这个命令:
  1. type 输入法管理器.LNK
复制代码
把结果贴出来看看
作者: 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
  1. 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 编辑

给个示例,自己对着改吧。。。
  1. @echo off
  2. set "folder=%userprofile%\「开始」菜单\程序\"
  3. for /f "delims=" %%a in ('dir /a-d /b /s "%folder%腾讯QQ.lnk"') do (
  4.   for /f "delims=" %%b in ('type "%%a"^|find /i ".exe"') do set "getpath=%%~dpb"
  5. )
  6. echo,%getpath%
  7. 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 编辑
  1. @echo off
  2. for /f "delims=" %%a in ('more "狙击.jgs.lnk" ^| findstr /ib [a-z]:\\') do set "lnk=%%a"
  3. echo %lnk%
  4. pause
复制代码
d:\我的文档\军旗\明\junqi2012_2_16_23_5.jgs
请按任意键继续. . .
  1. @echo off
  2. set "folder=%userprofile%\「开始」菜单\程序\"
  3. for /f "delims=" %%a in ('dir /b /a-d /s "%folder%\*.lnk"') do (
  4. for /f "delims=" %%b in ('more "%%a" ^| findstr /ib [a-z]:\\') do (
  5. echo "%%a" "%%b"
  6. )
  7. )
  8. 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://bathome.net./) Powered by Discuz! 7.2