找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 43030|回复: 9

[文件管理] 批处理获取快捷方式指向的路径

[复制链接]
发表于 2009-2-21 02:26:43 | 显示全部楼层 |阅读模式
本人发的都是原创的代码,如有雷同纯属巧合。
由于新手限制发帖,每次都只能发到代码咨询与讨论区,真是痛苦。
还有很多原创的好东东,也因为这个原因难以发上来,有空去我博客看罢了。
为避免误解在此发广告帖,就不提供博客地址了。

获取桌面上快捷方式指向的路径,以腾讯QQ2009为例。
其中主要使用到了type和find。
许多文件操作的命令都涉及到文本处理,文本处理有常常用到find命令,以前没有学过find,不懂它的意义,现在发现find和dir都是最基础和最重要的东西。
  1. @echo off
  2. if exist "%ALLUSERSPROFILE%\桌面\腾讯QQ.lnk" goto 1
  3. if exist "%USERPROFILE%\桌面\腾讯QQ.lnk" goto 2
  4. exit
  5. :1
  6. type  "%ALLUSERSPROFILE%\桌面\腾讯QQ.lnk">>q.txt
  7. goto 3
  8. :2
  9. type  "%USERPROFILE%\桌面\腾讯QQ.lnk">>q.txt
  10. goto 3
  11. :3
  12. find  /i  "QQ.exe"  q.txt >>a.txt
  13. for /f "skip=3 tokens=1,2 delims= " %%a in (a.txt) do echo %%~dpa %%~dpb>>b.txt
  14. del q.txt,a.txt
复制代码
重新修改了一下,否则又挨高手砖头了~!
  1. @echo off
  2. set /p iput=请输入需要查找的快捷方式名称:
  3. ::支持模糊搜索,不需要加lnk,不支持拖拉,主要用于辅助其它代码。
  4. ::使用时去掉/p,并把等于号后面的内容替换为需要查找的内容即可。
  5. type "%USERPROFILE%\桌面\*%iput%*.lnk" | find /i "exe" | find /i "">>找到路径.txt
  6. echo.
  7. type "%ALLUSERSPROFILE%\桌面\*%iput%*.lnk" | find /i "exe" | find /i "">>找到路径.txt
  8. start 找到路径.txt
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢分享

查看全部评分

发表于 2009-2-21 02:50:18 | 显示全部楼层
所发代码若不止一行,请务必用code标记把代码部分首尾括起来,以便他人复制;

Q: 如何用code把代码扩起来?
A: http://bbs.bathome.net/thread-404-1-1.html
 楼主| 发表于 2009-2-21 11:10:50 | 显示全部楼层
谢谢Batcher,已经修改过来了。
发表于 2009-2-21 20:07:30 | 显示全部楼层
把 .lnk 文件拖到批处理上:
  1. @echo off
  2. for /f "skip=3 delims=" %%a in ('find ":" %1') do echo %%a
  3. pause
复制代码
 楼主| 发表于 2009-2-22 20:52:54 | 显示全部楼层
原帖由 tireless 于 2009-2-21 20:07 发表
把 .lnk 文件拖到批处理上:@echo off
for /f "skip=3 delims=" %%a in ('find ":\" %1') do echo %%a
pause


呵呵,如果用手来拖根本就不必用批处理了,直接点右键查看了。
发表于 2009-2-22 21:14:37 | 显示全部楼层

回复 5楼 的帖子

你可以试试按照他的思路修改你的代码,取消临时文件的使用。
发表于 2009-3-21 22:38:50 | 显示全部楼层
发现:

more test.lnk 会分很多行显示
type test.lnk 是显示几行整行

这样可以得出快捷方式目标路径:

more test.lnk|findstr /i "^[A-Z]:\\\\"

这里看到的)为什么要四个 \ 符号,而不是两个呢?
发表于 2023-9-20 10:56:08 | 显示全部楼层
回复 5# cjiabing


    用手拖的意思,即是等同于把文件路径作为脚本的参数传递。
发表于 2023-12-7 14:58:40 | 显示全部楼层
看得出来作者是用心了的
发表于 2024-10-2 15:25:50 | 显示全部楼层
本帖最后由 tiandyoin 于 2024-10-3 02:04 编辑

回复 4# tireless

找到失败的例子:
建立到 Snipaste 2.9.2.0 的链接 Snipaste.exe.lnk,查看链接的内容如下:
  1. L...C:\︹熠1?湜...
  2. /E:...
  3. E:\Program Files\Snipaste(截屏)\Snipaste.exe...
复制代码
结果为 : C:\︹熠1?湜
可能是因为重装系统,解除bitlocker,移动了源目录等造成的,正常情况不会这样吧~

重新写一个
  1. @rem Usage:
  2. rem                获取快捷方式的目标路径:
  3. rem                直接读取 lnk 的内容,取出第二串 ASCII 路径。第一串是盘符如: /C:\
  4. :get_lnk_target6 {<@in &file=*.lnk> ,[@out target]}
  5.         call set "filepath=%%%~1%%"
  6.         setlocal enabledelayedexpansion
  7.                 set "filepath=!filepath:%%=""%%""!"
  8.         endlocal & set "filepath=%filepath%"
  9.         set target=
  10.         for /f "skip=2 delims=" %%a in ('find ":" "%filepath%"') do (
  11.                 if "%~2" neq "" (set "%~2=%%a") else echo "target=%%a"
  12.                 setlocal enabledelayedexpansion
  13.                         @if "!target:~0,1!!target:~0,1!"=="//" goto :eof
  14.                 endlocal
  15.                 set "target=%%a"
  16.         )
  17. @goto :eof

  18. call :get_lnk_target6 "...\xxx.lnk" returnVal
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 21:43 , Processed in 0.017588 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表