无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1016|回复: 26
打印 上一主题 下一主题

[已解决] 【已解决】bat能够检测.lnk是否有效吗?谢谢

[复制链接]
跳转到指定楼层
1#
发表于 2025-3-1 11:48:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yyz2191958 于 2025-3-3 13:47 编辑

完美解决了:

检.lnk是否有效(拖).bat
2>1/* ::
@echo off
::【检测:被拖文件,是文件夹 还是 文件(【文件夹】到:A,【文件】就提示)】
echo.
dir/ad "%~1" >nul 2>nul&&goto :A||echo  这是文件(文件夹才行)
pause>nul 2>nul&exit/b
:A
echo.%~1(目录路径)(回车打开)
echo.
set "目录路径=%~1"
dir /b "%目录路径%\*.lnk"|cscript /nologo /e:jscript "%~f0" "%目录路径%"
pause>nul 2>nul
start "" "%~1"
exit/b */
v=WSH.arguments, s=WSH.stdin, n=0
sF=WSH.CreateObject('Scripting.FileSystemObject')
ws=WSH.createObject('Shell.Application'), d=ws.NameSpace(v(0))
while (!s.atendofstream) {
    kF=s.readline(), di = d.ParseName(kF), lnk = di.GetLink
if (!sF.fileExists(lnk.path) && !sF.folderExists(lnk.path)) n++,WSH.echo('无效的  * .lnk :'+kF)
}
if (n==0) WSH.echo(v(0)+' 【*.lnk都有效】')
WSH.quit()
==================
运行的.bat
2>1/* ::
@echo off
echo.
echo.
echo.目录:延时3秒的(回车打开目录)
echo.
set "路径=D:\PE整理碎片(很好)\修改PE\启动\延时3秒的"
dir /b "%路径%\*.lnk"|cscript /nologo /e:jscript "%~f0" "%路径%"
pause>nul 2>nul
start "" "D:\PE整理碎片(很好)\修改PE\启动\延时3秒的"
exit/b */
v=WSH.arguments, s=WSH.stdin, n=0
sF=WSH.CreateObject('Scripting.FileSystemObject')
ws=WSH.createObject('Shell.Application'), d=ws.NameSpace(v(0))
while (!s.atendofstream) {
    kF=s.readline(), di = d.ParseName(kF), lnk = di.GetLink
    if (!sF.fileExists(lnk.path) && !sF.folderExists(lnk.path)) n++,WSH.echo('无效的  * .lnk :'+kF)
}
if (n==0) WSH.echo(v(0)+' 【*.lnk都有效】')
WSH.quit()

=================================================
原来的问题:
假设D:\579里面有不少快捷方式文件。其中,有一些是有效的,有一些是无效的。
bat能够检测.lnk是否有效吗?谢谢(10 PE环境  没有powershell )(bat、vbs、wcs、ahk)都行


















检测.lnk是否有效(完美).rar

2.7 KB, 下载次数: 7, 下载积分: 无忧币 -2

2#
发表于 2025-3-1 12:02:02 | 只看该作者
本帖最后由 呆萌鼠 于 2025-3-1 12:04 编辑

复制代码
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. REM 设置要检查的目录
  4. set "target_dir=D:\579"

  5. REM 遍历目录中的所有.lnk文件
  6. for %%f in ("%target_dir%\*.lnk") do (
  7.     REM 获取快捷方式的目标路径
  8.     set "lnk_path=%%f"
  9.     for /f "tokens=*" %%a in ('powershell -command "(New-Object -ComObject WScript.Shell).CreateShortcut('!lnk_path!').TargetPath"') do (
  10.         set "target_path=%%a"
  11.     )

  12.     REM 检查目标路径是否存在
  13.     if exist "!target_path!" (
  14.         echo 有效: %%f - !target_path!
  15.     ) else (
  16.         echo 无效: %%f - !target_path!
  17.     )
  18. )

  19. pause
复制代码

点评

谢谢分享  详情 回复 发表于 2025-3-1 19:46
10 PE 没有powershell怎么办?谢谢 ================ 'powershell' 不是内部或外部命令,也不是可运行的程序 或批处理文件。  详情 回复 发表于 2025-3-1 12:09
我试一试 谢谢  详情 回复 发表于 2025-3-1 12:04

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

3#
 楼主| 发表于 2025-3-1 12:04:34 | 只看该作者

点评

或者添加chcp 65001 >nul  详情 回复 发表于 2025-3-1 12:09
抱歉!刚才发错了,现在的对。  发表于 2025-3-1 12:06
回复

使用道具 举报

4#
发表于 2025-3-1 12:09:06 | 只看该作者

或者添加chcp 65001 >nul
  1. @echo off
  2. chcp 65001 >nul
  3. setlocal enabledelayedexpansion

  4. REM 设置要检查的目录
  5. set "target_dir=D:\579

  6. REM 遍历目录中的所有.lnk文件
  7. for %%f in ("%target_dir%\*.lnk") do (
  8.     REM 获取快捷方式的目标路径
  9.     set "lnk_path=%%f"
  10.     for /f "tokens=*" %%a in ('powershell -command "(New-Object -ComObject WScript.Shell).CreateShortcut('!lnk_path!').TargetPath"') do (
  11.         set "target_path=%%a"
  12.     )

  13.     REM 检查目标路径是否存在
  14.     if exist "!target_path!" (
  15.         echo 有效: %%f - !target_path!
  16.     ) else (
  17.         echo 无效: %%f - !target_path!
  18.     )
  19. )

  20. pause
复制代码
回复

使用道具 举报

5#
 楼主| 发表于 2025-3-1 12:09:57 | 只看该作者

10 PE  没有powershell怎么办?谢谢
================
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

点评

可以加上  详情 回复 发表于 2025-3-1 12:15
回复

使用道具 举报

6#
发表于 2025-3-1 12:11:38 | 只看该作者

回复

使用道具 举报

7#
发表于 2025-3-1 12:15:00 | 只看该作者
如果您的环境没有 PowerShell(例如在 WinPE 环境中),可以使用 VBScript 来替代 PowerShell 获取快捷方式的目标路径。
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. REM 设置要检查的目录
  4. set "target_dir=D:\579"

  5. REM 创建一个临时的 VBScript 文件来获取快捷方式的目标路径
  6. set "vbs_script=%temp%\get_target_path.vbs"
  7. (
  8.     echo Set objShell = CreateObject("WScript.Shell"^)
  9.     echo Set lnk = objShell.CreateShortcut(WScript.Arguments(0^)^)
  10.     echo WScript.Echo lnk.TargetPath
  11. ) > "%vbs_script%"

  12. REM 遍历目录中的所有.lnk文件
  13. for %%f in ("%target_dir%\*.lnk") do (
  14.     REM 使用 VBScript 获取快捷方式的目标路径
  15.     for /f "tokens=*" %%a in ('cscript //nologo "%vbs_script%" "%%f"') do (
  16.         set "target_path=%%a"
  17.     )

  18.     REM 检查目标路径是否存在
  19.     if exist "!target_path!" (
  20.         echo 有效: %%f - !target_path!
  21.     ) else (
  22.         echo 无效: %%f - !target_path!
  23.     )
  24. )

  25. REM 删除临时 VBScript 文件
  26. del "%vbs_script%"

  27. pause
复制代码

点评

这个成功 还一个问题就是:如果路径中有 英文的 ! 号,就自动退出(不能够判断) 能够修改一下吗?谢谢  详情 回复 发表于 2025-3-1 12:25

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

8#
发表于 2025-3-1 12:15:03 来自手机 | 只看该作者
yyz2191958 发表于 2025-3-1 12:09
10 PE  没有powershell怎么办?谢谢
================
'powershell' 不是内部或外部命令,也不是可运行 ...

可以加上
回复

使用道具 举报

9#
 楼主| 发表于 2025-3-1 12:25:08 | 只看该作者
呆萌鼠 发表于 2025-3-1 12:15
如果您的环境没有 PowerShell(例如在 WinPE 环境中),可以使用 VBScript 来替代 PowerShell 获取快捷方式 ...

这个成功

还一个问题就是:如果路径中有 英文的 ! 号,就自动退出(不能够判断)

能够修改一下吗?谢谢

点评

在批处理脚本中,! 是延迟变量扩展的特殊字符。如果路径中包含 !,会导致脚本解析错误或意外行为。为了避免这个问题,可以在脚本中临时禁用延迟变量扩展,或者在处理路径时对 ! 进行转义。以下是改进后的脚本,它会  详情 回复 发表于 2025-3-1 12:34
回复

使用道具 举报

10#
发表于 2025-3-1 12:34:46 | 只看该作者
yyz2191958 发表于 2025-3-1 12:25
这个成功

还一个问题就是:如果路径中有 英文的 ! 号,就自动退出(不能够判断)

[size=16.002px]在批处理脚本中,! 是延迟变量扩展的特殊字符。如果路径中包含 !,会导致脚本解析错误或意外行为。为了避免这个问题,可以在脚本中临时禁用延迟变量扩展,或者在处理路径时对 ! 进行转义。
[size=16.002px]以下是改进后的脚本,它会检测路径中是否包含 !,如果包含则跳过处理并提示用户:
  1. @echo off
  2. setlocal disabledelayedexpansion

  3. REM 设置要检查的目录
  4. set "target_dir=D:\579"

  5. REM 创建一个临时的 VBScript 文件来获取快捷方式的目标路径
  6. set "vbs_script=%temp%\get_target_path.vbs"
  7. (
  8.     echo Set objShell = CreateObject("WScript.Shell"^)
  9.     echo Set lnk = objShell.CreateShortcut(WScript.Arguments(0^)^)
  10.     echo WScript.Echo lnk.TargetPath
  11. ) > "%vbs_script%"

  12. REM 遍历目录中的所有.lnk文件
  13. for %%f in ("%target_dir%\*.lnk") do (
  14.     REM 检查路径中是否包含 !
  15.     echo %%f | find "!" >nul
  16.     if errorlevel 1 (
  17.         REM 如果不包含 !,继续处理
  18.         setlocal enabledelayedexpansion
  19.         for /f "tokens=*" %%a in ('cscript //nologo "%vbs_script%" "%%f"') do (
  20.             set "target_path=%%a"
  21.         )

  22.         REM 检查目标路径是否存在
  23.         if exist "!target_path!" (
  24.             echo 有效: %%f - !target_path!
  25.         ) else (
  26.             echo 无效: %%f - !target_path!
  27.         )
  28.         endlocal
  29.     ) else (
  30.         REM 如果包含 !,跳过并提示
  31.         echo 跳过: %%f - 路径中包含 ! 号
  32.     )
  33. )

  34. REM 删除临时 VBScript 文件
  35. del "%vbs_script%"

  36. pause
复制代码


点评

这个不行  发表于 2025-3-1 13:26
回复

使用道具 举报

11#
发表于 2025-3-1 13:14:01 | 只看该作者
本帖最后由 呆萌鼠 于 2025-3-1 13:17 编辑

修改后的代码
  1. @echo off
  2. setlocal disabledelayedexpansion

  3. REM 设置要检查的目录
  4. set "target_dir=D:\579"
  5. echo 正在检查目录: %target_dir%

  6. REM 检查目录是否存在
  7. if not exist "%target_dir%" (
  8.     echo 错误: 目录 %target_dir% 不存在。
  9.     pause
  10.     exit /b
  11. )

  12. REM 创建一个临时的 VBScript 文件来获取快捷方式的目标路径
  13. set "vbs_script=%temp%\get_target_path.vbs"
  14. echo 正在创建临时 VBScript 文件: %vbs_script%
  15. (
  16.     echo Set objShell = CreateObject("WScript.Shell"^)
  17.     echo Set lnk = objShell.CreateShortcut(WScript.Arguments(0^)^)
  18.     echo WScript.Echo lnk.TargetPath
  19. ) > "%vbs_script%"
  20. echo 临时文件创建完成。

  21. REM 检查临时文件是否创建成功
  22. if not exist "%vbs_script%" (
  23.     echo 错误: 无法创建临时 VBScript 文件。
  24.     pause
  25.     exit /b
  26. )

  27. REM 遍历目录中的所有.lnk文件
  28. for %%f in ("%target_dir%\*.lnk") do (
  29.     REM 禁用延迟变量扩展,避免 ! 被解析
  30.     setlocal disabledelayedexpansion
  31.     set "lnk_path=%%f"

  32.     REM 启用延迟变量扩展,获取目标路径
  33.     setlocal enabledelayedexpansion
  34.     for /f "tokens=*" %%a in ('cscript //nologo "%vbs_script%" "!lnk_path!"') do (
  35.         set "target_path=%%a"
  36.     )

  37.     REM 检查目标路径是否存在
  38.     if exist "!target_path!" (
  39.         echo 有效: !lnk_path! - !target_path!
  40.     ) else (
  41.         echo 无效: !lnk_path! - !target_path!
  42.     )
  43.     endlocal
  44.     endlocal
  45. )

  46. REM 删除临时 VBScript 文件
  47. echo 正在删除临时 VBScript 文件: %vbs_script%
  48. del "%vbs_script%"
  49. echo 临时文件已删除。

  50. pause
复制代码


点评

放置快捷方式的文件夹路径如果有 英文 ! 号,已经没有问题了 但是,如果快捷方式指向的源文件的路径中有 英文 ! 号,这个快捷方式就被判断为 无效 例如:X:%users\Default\Desktop\!233\333.txt,这个333.txt.l  详情 回复 发表于 2025-3-1 18:43
我再试一试 谢谢  详情 回复 发表于 2025-3-1 17:43
请用ANSI编码  发表于 2025-3-1 13:25

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

12#
发表于 2025-3-1 14:26:19 | 只看该作者

感谢分享
回复

使用道具 举报

13#
发表于 2025-3-1 14:42:42 | 只看该作者
你在批处理之家也发了相同的帖子。

大佬也给了答案。
回复

使用道具 举报

14#
发表于 2025-3-1 15:59:58 | 只看该作者
谢谢11楼分享
回复

使用道具 举报

15#
发表于 2025-3-1 17:42:41 | 只看该作者
本帖最后由 527104427 于 2025-3-1 17:43 编辑

保存为wcs
无效的快捷方式自动删除。不需要提示的话,把红色部分删掉就行了。

set^ EnviMode=1
set^ ForceLocal=1
forx D:\579\*.lnk,src,,
{
        link ? --f %src%,file
        ifex [ *<>file & %file% ], mess 有效 - %src%! team mess 无效 - %src%| file -force "%src%"
}

点评

我慢慢琢磨 谢谢  详情 回复 发表于 2025-3-1 18:36

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

16#
 楼主| 发表于 2025-3-1 17:43:02 | 只看该作者

我再试一试 谢谢
回复

使用道具 举报

17#
 楼主| 发表于 2025-3-1 18:36:14 | 只看该作者
527104427 发表于 2025-3-1 17:42
保存为wcs
无效的快捷方式自动删除。不需要提示的话,把红色部分删掉就行了。

我慢慢琢磨 谢谢
回复

使用道具 举报

18#
 楼主| 发表于 2025-3-1 18:43:06 | 只看该作者

放置快捷方式的文件夹路径如果有 英文 ! 号,已经没有问题了

但是,如果快捷方式指向的源文件的路径中有  英文 ! 号,这个快捷方式就被判断为 无效
例如:X:\Users\Default\Desktop\!233\333.txt,这个333.txt.lnk 就判断为 无效

点评

将遍历移入vbs  详情 回复 发表于 2025-3-1 19:26
回复

使用道具 举报

19#
发表于 2025-3-1 19:26:49 来自手机 | 只看该作者
yyz2191958 发表于 2025-3-1 18:43
放置快捷方式的文件夹路径如果有 英文 ! 号,已经没有问题了

但是,如果快捷方式指向的源文件的路径中 ...

将遍历移入vbs
回复

使用道具 举报

20#
发表于 2025-3-1 19:46:25 | 只看该作者
回复

使用道具 举报

21#
发表于 2025-3-5 16:16:47 | 只看该作者
感谢分享
回复

使用道具 举报

22#
发表于 2025-3-6 11:58:06 | 只看该作者
  感谢分享
回复

使用道具 举报

23#
发表于 2025-3-6 14:46:42 | 只看该作者
感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-4-3 05:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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