标题: [文件操作] [已解决]批处理如何获取lnk快捷方式文件指向的目标程序的路径及其附带的参数 [打印本页]
作者: adan1 时间: 2016-12-5 12:56 标题: [已解决]批处理如何获取lnk快捷方式文件指向的目标程序的路径及其附带的参数
本帖最后由 adan1 于 2016-12-7 13:49 编辑
请问这批处理怎样转成单行?
不知为何我的账号被删了,帖子也没了,原本的帖子是获取lnk快捷文件指向的文件路径及其附带的参数。
原贴的答案,不知如何贴回来了,就剩下这个问题。加括号跟&,都会出错。- @echo off
- set "p=%1"
- if /i %p:~-3% neq LNK (C:\a.exe %1 /L) &exit
- mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%1""): wsh.run ""C:\a.exe"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""/L"": close")
-
- pause
复制代码
作者: CommandBatCmd 时间: 2016-12-5 18:05
回复 1# adan1
你的代码看上去没有问题,
只是双击运行会出错,启用变量延迟扩展即可,
拖放文件去执行,可以正常运行。
要是放到P文件中运行,搞成多行修改起来方便:- @echo off&setlocal EnableDelayedExpansion
- set "p=%~1"
- 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")
- )
- pause
复制代码
一定要搞成单行:- @echo off&setlocal EnableDelayedExpansion
- set "p=%~1"
- 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")
- 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
我算是把它改好了- @echo off & setlocal EnableDelayedExpansion &
- set "pg=C:\a.exe" & set "LID=/L" & set "p=%~1" &
- if /i !p:~-4! neq .LNK ((start "" /i !pg! %1 !LID!)&echo exit
- ) else mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%~1""): wsh.run ""!pg!"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""!LID!"": close")
复制代码
拖文件到批处理执行是完全正常的,而CMD中执行批处理是有部分不正常。- final.bat C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe
- final.bat "C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe"
- final.bat C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe.lnk
- final.bat "C:\Users\Adan\Desktop\TEST\1_2_3\notepad.exe.lnk"
- final.bat C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe <- 失效
- final.bat "C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe"
- final.bat C:\Users\Adan\Desktop\TEST\1 2 3\notepad.exe.lnk <- 失效
- 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 - %~I - 删除任何引号("),扩展 %I
- %~fI - 将 %I 扩展到一个完全合格的路径名
- %~dI - 仅将 %I 扩展到一个驱动器号
- %~pI - 仅将 %I 扩展到一个路径
- %~nI - 仅将 %I 扩展到一个文件名
- %~xI - 仅将 %I 扩展到一个文件扩展名
- %~sI - 扩展的路径只含有短名
- %~aI - 将 %I 扩展到文件的文件属性
- %~tI - 将 %I 扩展到文件的日期/时间
- %~zI - 将 %I 扩展到文件的大小
- %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
- 到找到的第一个完全合格的名称。如果环境变量名
- 未被定义,或者没有找到文件,此组合键会扩展到空字符串
-
- 可以组合修饰符来得到多重结果:
-
- %~dpI - 仅将 %I 扩展到一个驱动器号和路径
- %~nxI - 仅将 %I 扩展到一个文件名和扩展名
- %~fsI - 仅将 %I 扩展到一个带有短名的完整路径名
- %~dp$PATH:I - 搜索列在路径环境变量的目录,并将 %I 扩展
- 到找到的第一个驱动器号和路径。
- %~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下是无解的。
附最终代码结贴好了。- @echo off & setlocal EnableDelayedExpansion &
- set "pg=%windir%\a.exe" & set "LID=/L" &
- if /i "%~x1" neq ".LNK" ((start "" /i !pg! %1 !LID!)&echo exit
- ) else mshta VBScript:Execute("set wsh=CreateObject(""WScript.Shell""): set lnk=wsh.CreateShortcut(""%~1""): wsh.run ""!pg!"" &"" """"""& lnk.TargetPath &"""""" """"""& lnk.Arguments &"""""" ""& ""!LID!"": close")
-
- :pause
复制代码
作者: tiandyoin 时间: 2023-4-24 00:27
直接调用 lnk 文件就行了,非要拆出参数来处理的话,
以 ”chrome 浏览器的自定义快捷方式“ 为例,先手动将 chrome 的快捷方式修改为把数据目录和缓存目录重定向到 D 盘。
这时要调用 lnk 文件并读取它的参数,
参考如下:- @goto :main
-
- @rem Usage:
- rem "快捷方式的读取和运行.bat" "C:\your path\Google Chrome (重定向用户文件夹).lnk"
- rem "C:\your path\Google Chrome (重定向用户文件夹).lnk" 右键“属性” - 目标:
- 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"
-
-
- :main
- @echo off&setlocal EnableDelayedExpansion
- set "p=%~1"
- if /i not "%~x1"==".LNK" (echo exit) else (
- (echo Dim objShell, objFolder, objFolderItem, objShellLink, s
- echo Set objShell = CreateObject("Shell.Application"^) ''创建对象
- echo Set objFolder = objShell.NameSpace("%~dp1"^) ''LNK文件所在目录路径
- echo Set objFolderItem = objFolder.ParseName("%~nx1"^) ''LNK文件名
- echo Set objShellLink = objFolderItem.GetLink ''获取快捷方式对象
- echo Set wshShell=CreateObject("WScript.Shell"^)
- @REM 方法 8
- REM echo wshShell.Run """" ^& objShellLink.Path ^& """" ^& Chr(32^) ^& objShellLink.Arguments
- @REM 方法 7
- echo wshShell.Run """%~1"""
- Set wshShell = Nothing
- Set objShell = Nothing
- )>"%TEMP%\makelnk.vbs"
- "%TEMP%"\makelnk.vbs
- del /f /q "%TEMP%\makelnk.vbs"
- )
- goto :eof
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |