AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79024133
Accepted
Sahar Kord
Sahar Kord
Asked: 2024-09-26 01:25:55 +0800 CST2024-09-26 01:25:55 +0800 CST 2024-09-26 01:25:55 +0800 CST

验证快捷方式文件中引用的可执行文件是否存在

  • 772

我有一个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无法在循环中检查。

batch-file
  • 2 2 个回答
  • 28 Views

2 个回答

  • Voted
  1. Compo
    2024-09-26T02:52:29+08:002024-09-26T02:52:29+08:00

    以下是相同代码的几个版本,希望对您有帮助:

    正如您的代码一样,这个使用当前目录作为快捷方式的位置:

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    
    Set "LnkPath=%CD:~2%"
    
    For /F "Skip=2 Tokens=2,3 Delims=," %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Path Win32_ShortcutFile Where "Drive='%CD:~,2%' And Extension='lnk' And Path='%LnkPath:\=\\%\\'" Get Name^, Target /Format:CSV 2^>NUL') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Exist "%%I" (Echo %%~nG does not point to an existing file) Else Echo %%~nG points to %%I
    Pause
    

    这个也使用当前目录:

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    
    Set "LnkPath=%__CD__:~2%"
    
    For /F "Skip=2 Tokens=2,3 Delims=," %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Path Win32_ShortcutFile Where "Drive='%__CD__:~,2%' And Extension='lnk' And Path='%LnkPath:\=\\%'" Get Name^, Target /Format:CSV 2^>NUL') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Exist "%%I" (Echo %%~nG does not point to an existing file) Else Echo %%~nG points to %%I
    Pause
    

    这个使用您正在运行的批处理文件的父目录:

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    
    Set "LnkPath=%~p0"
    
    For /F "Skip=2 Tokens=2,3 Delims=," %%G In ('%SystemRoot%\System32\wbem\WMIC.exe Path Win32_ShortcutFile Where "Drive='%~d0' And Extension='lnk' And Path='%LnkPath:\=\\%'" Get Name^, Target /Format:CSV 2^>NUL') Do For /F "Tokens=*" %%I In ("%%H") Do If Not Exist "%%I" (Echo %%~nG does not point to an existing file) Else Echo %%~nG points to %%I
    Pause
    

    我这样做是因为它仅使用 WMIC.exe 的一个实例(一个特别慢的命令),因此比对找到的每个快捷方式运行一次要高效得多。


    如果你仍然想按照自己的方式去做,那么也许这会有所帮助:

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    
    For %%G In (*.lnk) Do (
        Set "LnkFullPath=%%~fG"
        SetLocal EnableDelayedExpansion
        For /F "Skip=2 Tokens=2,3 Delims=," %%H In ('
         %SystemRoot%\System32\wbem\WMIC.exe Path Win32_ShortcutFile Where
         "Name='!LnkFullPath:\=\\!'" Get Name^, Target /Format:CSV 2^>NUL'
        ) Do For /F "Delims=" %%J In ("%%I") Do EndLocal & If Not Exist "%%J" (
            Echo %%~nH does not point to an existing file
        ) Else Echo %%~nH points to %%J
    )
    Pause
    

    您会注意到,For /F似乎毫无理由地添加了一个额外的循环。这是由于WMIC.exe输出非常奇怪的行结束序列而提出的特殊要求。

    • 0
  2. Best Answer
    Mofi
    2024-09-26T03:51:22+08:002024-09-26T03:51:22+08:00

    以下批处理文件适用于快捷方式文件中使用属性Target定义的几乎所有快捷方式文件名和命令行。

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    for %%I in ("%~dp0*.lnk") do (
        set "ShortcutFile=%%I"
        setlocal EnableDelayedExpansion
        for /F "tokens=1* delims==" %%G in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_ShortcutFile where "name='!ShortcutFile:\=\\!'" GET Target /VALUE 2^>nul') do (
            endlocal
            if "%%G" == "Target" (
                for /F "eol=| delims=" %%J in ("%%H") do (
                    if /I not "%%~xJ" == ".exe" if /I not "%%~xJ" == ".com" set "ShortcutFile="
                    if defined ShortcutFile (
                        if exist "%%J" (
                            echo Shortcut "%%~nI" can be used as file "%%J" exists.
                        ) else (
                            set "ExecutableFile=%%J"
                            set "ShortcutFile=%%~nI"
                            setlocal EnableDelayedExpansion
                            set "ExecutableFile=!ExecutableFile:&=&!"
                            if exist "!ExecutableFile!" (
                                echo Shortcut "!ShortcutFile!" can be used as file "!ExecutableFile!" exists.
                            ) else (
                                echo Shortcut "!ShortcutFile!" cannot be used as file "!ExecutableFile!" does not exist.
                            )
                            endlocal
                            set "ExecutableFile="
                        )
                        set "ShortcutFile="
                    ) else echo Shortcut "%%~nI" does not reference an executable. Simple execution verification is not possible.
                )
                if defined ShortcutFile (
                    echo Shortcut "%%~nI" has no property Target with a file name. Simple execution verification is not possible.
                    set "ShortcutFile="
                )
            )
        )
        if defined ShortcutFile endlocal & echo Shortcut "%%~nI" verification failed as WMIC failed to process the shortcut file.
    )
    endlocal
    

    批处理文件处理*.lnk批处理文件目录中的所有文件。将%~dp0第三行替换为不同的路径,如%USERPROFILE%\Desktop(Windows 默认为当前用户的桌面目录)或%PUBLIC%\Desktop(Windows 默认为所有用户的桌面目录)。也可以直接删除%~dp0以使用当前工作目录,但在这种情况下必须修改第四行,set "ShortcutFile=%%~fI"因为WMIC需要快捷方式文件的完全限定文件名。

    该批处理文件考虑以下用例:

    1. 快捷方式文件不是典型的*.lnk不带Target属性的文件。某些为 Microsoft 应用程序创建的快捷方式文件不带Target属性。
    2. 完全限定的快捷方式文件名包含字符,&()[]{}^=;!'+,`~因此在批处理文件中处理它们时需要小心。例如,在处理此类文件名时无法永久启用延迟变量扩展,因为这会导致在执行命令之前对文件名字符串进行双重解析,并将文件名字符串中的每个感叹号解释为延迟扩展变量引用的开始/结束。
    3. Target属性的第一个参数字符串是完全限定的文件名,其中包含字符,&()[]{}^=;!'+,`~因此在批处理文件中处理它们时也需要小心。程序文件名中的等号、感叹号和 & 符号在批处理文件中需要特殊代码才能正确处理。
    4. 使用快捷方式文件启动的可执行文件的文件名中的“与”符号会被WMIC与实体一起输出&,而不仅仅是&在检查程序文件是否存在时必须考虑的实体。
    5. 如果快捷方式用于引用/打开文件夹,则快捷方式文件的属性目标可以以不同于可执行文件名的内容开头,例如文件夹名称,或者用于使用用户配置的用于打开 PDF 文件的任何应用程序打开 PDF 文件的名称。
    6. 带有文件扩展名的文件.lnk根本不是快捷方式文件。该文件的文件扩展名错误。

    处理快捷方式文件时,如果文件名Test!.lnk以Target开头,则非常棘手"C:\Temp\Test\Development & Test 100% (!) = Full Test\Test!.exe"。由于文件夹名称不常见,因此很难处理文件名。但此批处理文件也可以处理该快捷方式文件。

    用于测试一组快捷方式文件,结果产生了以下批处理文件的输出:

    Shortcut "Folder" does not reference an executable. Simple execution verification is not possible.
    Shortcut "Invalid" verification failed as WMIC failed to process the shortcut file.
    Shortcut "MediaViewer" can be used as file "C:\Programs\MediaViewer\MediaViewer.exe" exists.
    Shortcut "Missing Executable" cannot be used as file "C:\Temp\Test\iexplore.exe" does not exist.
    Shortcut "Software Center" has no property Target with a file name. Simple execution verification is not possible.
    Shortcut "Test!" can be used as file "C:\Temp\Test\Development & Test 100% (!) = Full Test\Test!.exe" exists.
    Shortcut "Word" can be used as file "C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE" exists.
    
    • 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

    • 0

相关问题

  • 替换批处理文件中环境变量中的文本时的转义百分比

  • .bat 脚本复制明天日期的文件

  • 使用 .bat 文件重命名文件夹中的文件

  • 我的批处理代码在尝试转到 :apps 标签后崩溃

  • 批处理文件删除变量中.#后面的文本

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve