Board logo

标题: [文件操作] [已解决]批处理如何获取lnk快捷方式文件指向的目标程序的路径及其附带的参数 [打印本页]

作者: adan1    时间: 2016-12-5 12:56     标题: [已解决]批处理如何获取lnk快捷方式文件指向的目标程序的路径及其附带的参数

本帖最后由 adan1 于 2016-12-7 13:49 编辑

请问这批处理怎样转成单行?
不知为何我的账号被删了,帖子也没了,原本的帖子是获取lnk快捷文件指向的文件路径及其附带的参数。
原贴的答案,不知如何贴回来了,就剩下这个问题。加括号跟&,都会出错。
  1. @echo off
  2. set "p=%1"
  3. if /i %p:~-3% neq LNK (C:\a.exe %1 /L) &exit
  4. mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%1""): wsh.run ""C:\a.exe"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""/L"": close")
  5. pause
复制代码

作者: CommandBatCmd    时间: 2016-12-5 18:05

回复 1# adan1

你的代码看上去没有问题,
只是双击运行会出错,启用变量延迟扩展即可,
拖放文件去执行,可以正常运行。

要是放到P文件中运行,搞成多行修改起来方便:
  1. @echo off&setlocal EnableDelayedExpansion
  2. set "p=%~1"
  3. if /i not "!p:~-4!"==".LNK" (
  4.     start /i "" C:\a.exe "%~1" /L
  5.     exit
  6. ) else (
  7.     mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%~1""): wsh.run ""C:\a.exe"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""/L"": close")
  8. )
  9. pause
复制代码
一定要搞成单行:
  1. @echo off&setlocal EnableDelayedExpansion
  2. set "p=%~1"
  3. if /i not "!p:~-4!"==".LNK" ((start "" /i C:\a.exe "%~1" /L)&exit) else mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%~1""): wsh.run ""C:\a.exe"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""/L"": close")
  4. pause
复制代码

作者: adan1    时间: 2016-12-5 23:21

回复 2# CommandBatCmd


感谢,你的单行算是起作用了。其实我想写的就是把文件拖到批处理里运行,直接双击运行肯定有问题的。那么这样还必须要用变量延迟吗?如果可以不用,我就尽可能省略它。
我这边试着搞,感觉双引号很容易出问题,用cmd去执行批处理+文件路径(分别加双引号和不加),老是出一些不明错误 什么“此处不应该有xxx”
作者: CommandBatCmd    时间: 2016-12-6 02:37

回复 3# adan1


    如果那个单行命令的P文双击和拖放运行都没问题,
而在cmd窗口中去用批处理+文件路径执行却出现问题,
这可能是输入时,引号的位置以及多了或少了引起的,
不知LZ输入了怎样的一行内容,执行出了错?
作者: pcl_test    时间: 2016-12-6 15:56

回复 2# CommandBatCmd

%~x1可获得扩展名,可不必重新定义新的变量,不要被LZ的思路牵着走
作者: CommandBatCmd    时间: 2016-12-6 16:20

回复 5# pcl_test

是啊!版主的建议很好!!!
作者: adan1    时间: 2016-12-6 16:56

本帖最后由 adan1 于 2016-12-6 17:03 编辑

回复 4# CommandBatCmd

我算是把它改好了
  1. @echo off & setlocal EnableDelayedExpansion &
  2. set "pg=C:\a.exe" & set "LID=/L" & set "p=%~1" &
  3. if /i !p:~-4! neq .LNK ((start "" /i !pg! %1 !LID!)&echo exit
  4. ) else mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%~1""): wsh.run ""!pg!"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""!LID!"":  close")
复制代码
拖文件到批处理执行是完全正常的,而CMD中执行批处理是有部分不正常。
  1. final.bat C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe
  2. final.bat "C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe"
  3. final.bat C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe.lnk
  4. final.bat "C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe.lnk"
  5. final.bat C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe                        <- 失效
  6. final.bat "C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe"
  7. final.bat C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe.lnk                    <- 失效
  8. final.bat "C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe.lnk"
复制代码

作者: adan1    时间: 2016-12-6 16:58

回复 5# pcl_test


    那是因为不知道怎样截取%1之类参数,才用了个新变量临时办法 。
作者: 老刘1号    时间: 2016-12-6 19:55

本帖最后由 老刘1号 于 2016-12-6 20:17 编辑

回复 8# adan1
  1.      %~I          - 删除任何引号("),扩展 %I
  2.      %~fI         - 将 %I 扩展到一个完全合格的路径名
  3.      %~dI        - 仅将 %I 扩展到一个驱动器号
  4.      %~pI        - 仅将 %I 扩展到一个路径
  5.      %~nI        - 仅将 %I 扩展到一个文件名
  6.      %~xI        - 仅将 %I 扩展到一个文件扩展名
  7.      %~sI        - 扩展的路径只含有短名
  8.      %~aI        - 将 %I 扩展到文件的文件属性
  9.      %~tI        - 将 %I 扩展到文件的日期/时间
  10.      %~zI        - 将 %I 扩展到文件的大小
  11.      %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
  12.                    到找到的第一个完全合格的名称。如果环境变量名
  13.                    未被定义,或者没有找到文件,此组合键会扩展到空字符串
  14. 可以组合修饰符来得到多重结果:
  15.      %~dpI       - 仅将 %I 扩展到一个驱动器号和路径
  16.      %~nxI       - 仅将 %I 扩展到一个文件名和扩展名
  17.      %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名
  18.      %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
  19.                    到找到的第一个驱动器号和路径。
  20.      %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR
复制代码
这个对于外参(args)也适用。
作者: CommandBatCmd    时间: 2016-12-6 21:10

回复 7# adan1


    测试中出现的两个失败是正常的,不失败才不正常,
因为路径中有空格须用双引号包括后传递。
祝你心想事成!
作者: adan1    时间: 2016-12-6 22:42

回复 10# CommandBatCmd


    有点强迫症,也想要把这个给修复,就是VBS里的双引号转义实在蛋疼。
作者: adan1    时间: 2016-12-6 22:42

回复 9# 老刘1号


    感谢提示
作者: CommandBatCmd    时间: 2016-12-6 23:06

回复 11# adan1


   两个失败的文件不是拖放,而是手动输入的吧?!
是否想把这两个改成不要双引号,也能在CMD窗口正确运行?
是不是已经有了好想法!?
作者: adan1    时间: 2016-12-7 13:48

回复 13# CommandBatCmd

我用进程管理器看了下,CMD下执行那两条命令,不加双引号就是只认空格前的路径,而拖文件的方式是会自动加双引号的,所以CMD下是无解的。
附最终代码结贴好了。
  1. @echo off & setlocal EnableDelayedExpansion &
  2. set "pg=%windir%\a.exe" & set "LID=/L" &
  3. if /i "%~x1" neq ".LNK" ((start "" /i !pg! %1 !LID!)&echo exit
  4. ) else mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%~1""): wsh.run ""!pg!"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""!LID!"": close")
  5. :pause
复制代码

作者: tiandyoin    时间: 2023-4-24 00:27

直接调用 lnk 文件就行了,非要拆出参数来处理的话,
以 ”chrome 浏览器的自定义快捷方式“ 为例,先手动将 chrome 的快捷方式修改为把数据目录和缓存目录重定向到 D 盘。
这时要调用 lnk 文件并读取它的参数,
参考如下:
  1. @goto :main
  2. @rem Usage:
  3. rem "快捷方式的读取和运行.bat" "C:\your path\Google Chrome (重定向用户文件夹).lnk"
  4. rem "C:\your path\Google Chrome (重定向用户文件夹).lnk" 右键“属性” - 目标:
  5. rem "C:\Program Files\Google\Chrome\Application\chrome.exe" --enable-contextual-search --user-data-dir="D:\Program Files\Google\Chrome\User Data" --disk-cache-dir="D:\Program Files\Google\Chrome\cache"
  6. :main
  7. @echo off&setlocal EnableDelayedExpansion
  8. set "p=%~1"
  9. if /i not "%~x1"==".LNK" (echo exit) else (
  10. (echo Dim objShell, objFolder, objFolderItem, objShellLink, s
  11. echo Set objShell = CreateObject("Shell.Application"^)               ''创建对象
  12. echo Set objFolder = objShell.NameSpace("%~dp1"^)                    ''LNK文件所在目录路径
  13. echo Set objFolderItem = objFolder.ParseName("%~nx1"^)               ''LNK文件名
  14. echo Set objShellLink = objFolderItem.GetLink                        ''获取快捷方式对象
  15. echo Set wshShell=CreateObject("WScript.Shell"^)
  16. @REM 方法 8
  17. REM echo wshShell.Run """" ^& objShellLink.Path ^& """" ^& Chr(32^) ^& objShellLink.Arguments
  18. @REM 方法 7
  19. echo wshShell.Run """%~1"""
  20. Set wshShell = Nothing
  21. Set objShell = Nothing
  22. )>"%TEMP%\makelnk.vbs"
  23. "%TEMP%"\makelnk.vbs
  24. del /f /q "%TEMP%\makelnk.vbs"
  25. )
  26. goto :eof
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2