我有一个file.lnk
来自另一条路径的快捷方式(在桌面上称为)file.exe
。
然后我在桌面上的快捷方式(file.lnk)附近有一个 run.bat。
我的run.bat内容代码如下:
Start "" file.lnk Echo "all done or crashed shortcut even my shortcut corrupted continue to process and don't stop"
。
我的问题如下:
当我的file.exe
被删除(我的快捷方式file.lnk
已损坏)时,然后是 run.bat,它会向我显示一个弹出消息,说您的文件已被删除。请选择三个选项之一(恢复文件 - 删除文件 - 取消),但我不想停止弹出的过程。我想继续,即使每次出现错误或弹出。
(这是我的结构。我必须使用快捷方式,唯一需要做的就是跳过损坏的快捷方式消息或自动回答已删除的问题file.lnk
。我不想停止这个过程)。
在@stephan 帮助后我尝试了此代码。
@echo off
:this is for check all shortcut file in a folder
for %%x in (*) do (
set shortcutpath=%%~x
for /f "tokens=2 delims==" %%a in ('wmic path win32_shortcutfile where "name='%shortcutpath:\=\\%'" get target /value') do (IF EXIST %%a echo "no problem,File exist & can you start")
)
echo by
pause
我也尝试使用!var!
,但是没有用。
另外,使用!shortcutpath:\=\\!
。它可以工作并%%a
给我正确的输出(快捷方式目标路径),但是当我想检查IF EXIST
该路径字符串时('%%a'
)。
它给出了错误的输出,虽然路径是正确的,但似乎IF EXSIST
无法在循环中检查。
以下是相同代码的几个版本,希望对您有帮助:
正如您的代码一样,这个使用当前目录作为快捷方式的位置:
这个也使用当前目录:
这个使用您正在运行的批处理文件的父目录:
我这样做是因为它仅使用 WMIC.exe 的一个实例(一个特别慢的命令),因此比对找到的每个快捷方式运行一次要高效得多。
如果你仍然想按照自己的方式去做,那么也许这会有所帮助:
您会注意到,
For /F
似乎毫无理由地添加了一个额外的循环。这是由于WMIC.exe
输出非常奇怪的行结束序列而提出的特殊要求。以下批处理文件适用于快捷方式文件中使用属性Target定义的几乎所有快捷方式文件名和命令行。
批处理文件处理
*.lnk
批处理文件目录中的所有文件。将%~dp0
第三行替换为不同的路径,如%USERPROFILE%\Desktop
(Windows 默认为当前用户的桌面目录)或%PUBLIC%\Desktop
(Windows 默认为所有用户的桌面目录)。也可以直接删除%~dp0
以使用当前工作目录,但在这种情况下必须修改第四行,set "ShortcutFile=%%~fI"
因为WMIC需要快捷方式文件的完全限定文件名。该批处理文件考虑以下用例:
*.lnk
不带Target属性的文件。某些为 Microsoft 应用程序创建的快捷方式文件不带Target属性。&()[]{}^=;!'+,`~
因此在批处理文件中处理它们时需要小心。例如,在处理此类文件名时无法永久启用延迟变量扩展,因为这会导致在执行命令之前对文件名字符串进行双重解析,并将文件名字符串中的每个感叹号解释为延迟扩展变量引用的开始/结束。&()[]{}^=;!'+,`~
因此在批处理文件中处理它们时也需要小心。程序文件名中的等号、感叹号和 & 符号在批处理文件中需要特殊代码才能正确处理。&
,而不仅仅是&
在检查程序文件是否存在时必须考虑的实体。.lnk
根本不是快捷方式文件。该文件的文件扩展名错误。处理快捷方式文件时,如果文件名
Test!.lnk
以Target开头,则非常棘手"C:\Temp\Test\Development & Test 100% (!) = Full Test\Test!.exe"
。由于文件夹名称不常见,因此很难处理文件名。但此批处理文件也可以处理该快捷方式文件。用于测试一组快捷方式文件,结果产生了以下批处理文件的输出:
Folder.lnk
将现有文件夹的完全限定文件名作为目标。Invalid.lnk
根本不是快捷方式文件。它是名为 的批处理文件的副本Invalid.lnk
。MediaViewer.lnk
很容易处理,因为完全合格的程序文件名不包含任何特殊字符,甚至不包含空格字符。Missing Executable.lnk
在确实存在的情况下创建了该程序C:\Temp\Test\iexplore.exe
,但是在创建快捷方式文件后,该可执行文件就被删除了。Software Center.lnk
是一个特殊的快捷方式,没有属性Target。此快捷方式以 为起始
C:\Windows\CCM\scclient.exe
。Test!.lnk
以 为目标的命令行开头,"C:\Temp\Test\Development & Test 100% (!) = Full Test\Test!.exe"
在批处理文件中很难处理。Word.lnk
是程序文件名中带有空格的典型快捷方式,但不包含Windows 命令处理器所含特殊含义的字符。还应阅读:如何在 WMIC 的 WHERE 子句中转义逗号和右括号?上面的批处理文件不能解决WMIC在
where
子句中对文件名的限制,因为文件名包含在 中'
。当然,如果由于不常见的快捷方式文件名而需要解决方法,则可以包含解决方法。批处理文件也不会检查是否
wmic.exe
已安装。默认情况下,WMI 命令行实用程序已弃用,可能不再安装。它是一个可选的 Windows 组件。最好先检查是否wmic.exe
可用,然后通知用户此处缺少验证快捷方式所需的可执行文件。请参阅我在批处理文件中查找文件是否超过 4 小时的答案中的第二个批处理代码,以获取存在性检查的示例代码wmic.exe
和缺少可执行文件的用户信息。要了解所使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并完整仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
for /?
if /?
set /?
setlocal /?
wmic /?
wmic path /?
wmic path Win32_ShortcutFile /?
wmic path Win32_ShortcutFile get /?
还应该阅读此处使用的Win32_ShortcutFile 类的 Microsoft 文档。
阅读有关使用命令重定向运算符的 Microsoft 文档以了解 的解释
2>nul
。当 Windows 命令解释器在执行命令 FOR 之前处理此命令行时,重定向运算符>
必须用FOR^
命令行上的插入符号进行转义,才能被解释为文字字符,而命令FOR会使用在后台启动的单独命令进程执行嵌入的命令行。wmic