无忧启动论坛
标题: 【已解决】bat能够检测.lnk是否有效吗?谢谢 [打印本页]
作者: yyz2191958 时间: 2025-3-1 11:48
标题: 【已解决】bat能够检测.lnk是否有效吗?谢谢
本帖最后由 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)都行
[attach]555088[/attach]
-
-
检测.lnk是否有效(完美).rar
2.7 KB, 下载次数: 7, 下载积分: 无忧币 -2
作者: 呆萌鼠 时间: 2025-3-1 12:02
本帖最后由 呆萌鼠 于 2025-3-1 12:04 编辑
- @echo off
- setlocal enabledelayedexpansion
- REM 设置要检查的目录
- set "target_dir=D:\579"
- REM 遍历目录中的所有.lnk文件
- for %%f in ("%target_dir%\*.lnk") do (
- REM 获取快捷方式的目标路径
- set "lnk_path=%%f"
- for /f "tokens=*" %%a in ('powershell -command "(New-Object -ComObject WScript.Shell).CreateShortcut('!lnk_path!').TargetPath"') do (
- set "target_path=%%a"
- )
- REM 检查目标路径是否存在
- if exist "!target_path!" (
- echo 有效: %%f - !target_path!
- ) else (
- echo 无效: %%f - !target_path!
- )
- )
- pause
复制代码
作者: yyz2191958 时间: 2025-3-1 12:04
我试一试 谢谢
作者: 呆萌鼠 时间: 2025-3-1 12:09
或者添加chcp 65001 >nul
- @echo off
- chcp 65001 >nul
- setlocal enabledelayedexpansion
- REM 设置要检查的目录
- set "target_dir=D:\579
- REM 遍历目录中的所有.lnk文件
- for %%f in ("%target_dir%\*.lnk") do (
- REM 获取快捷方式的目标路径
- set "lnk_path=%%f"
- for /f "tokens=*" %%a in ('powershell -command "(New-Object -ComObject WScript.Shell).CreateShortcut('!lnk_path!').TargetPath"') do (
- set "target_path=%%a"
- )
- REM 检查目标路径是否存在
- if exist "!target_path!" (
- echo 有效: %%f - !target_path!
- ) else (
- echo 无效: %%f - !target_path!
- )
- )
- pause
复制代码
作者: yyz2191958 时间: 2025-3-1 12:09
10 PE 没有powershell怎么办?谢谢
================
'powershell' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
作者: 呆萌鼠 时间: 2025-3-1 12:11

作者: 呆萌鼠 时间: 2025-3-1 12:15
如果您的环境没有 PowerShell(例如在 WinPE 环境中),可以使用 VBScript 来替代 PowerShell 获取快捷方式的目标路径。
- @echo off
- setlocal enabledelayedexpansion
- REM 设置要检查的目录
- set "target_dir=D:\579"
- REM 创建一个临时的 VBScript 文件来获取快捷方式的目标路径
- set "vbs_script=%temp%\get_target_path.vbs"
- (
- echo Set objShell = CreateObject("WScript.Shell"^)
- echo Set lnk = objShell.CreateShortcut(WScript.Arguments(0^)^)
- echo WScript.Echo lnk.TargetPath
- ) > "%vbs_script%"
- REM 遍历目录中的所有.lnk文件
- for %%f in ("%target_dir%\*.lnk") do (
- REM 使用 VBScript 获取快捷方式的目标路径
- for /f "tokens=*" %%a in ('cscript //nologo "%vbs_script%" "%%f"') do (
- set "target_path=%%a"
- )
- REM 检查目标路径是否存在
- if exist "!target_path!" (
- echo 有效: %%f - !target_path!
- ) else (
- echo 无效: %%f - !target_path!
- )
- )
- REM 删除临时 VBScript 文件
- del "%vbs_script%"
- pause
复制代码
作者: szwp 时间: 2025-3-1 12:15
yyz2191958 发表于 2025-3-1 12:09
10 PE 没有powershell怎么办?谢谢
================
'powershell' 不是内部或外部命令,也不是可运行 ...
可以加上
作者: yyz2191958 时间: 2025-3-1 12:25
这个成功
还一个问题就是:如果路径中有 英文的 ! 号,就自动退出(不能够判断)
能够修改一下吗?谢谢
作者: 呆萌鼠 时间: 2025-3-1 12:34
[size=16.002px]在批处理脚本中,! 是延迟变量扩展的特殊字符。如果路径中包含 !,会导致脚本解析错误或意外行为。为了避免这个问题,可以在脚本中临时禁用延迟变量扩展,或者在处理路径时对 ! 进行转义。
[size=16.002px]以下是改进后的脚本,它会检测路径中是否包含 !,如果包含则跳过处理并提示用户:
- @echo off
- setlocal disabledelayedexpansion
- REM 设置要检查的目录
- set "target_dir=D:\579"
- REM 创建一个临时的 VBScript 文件来获取快捷方式的目标路径
- set "vbs_script=%temp%\get_target_path.vbs"
- (
- echo Set objShell = CreateObject("WScript.Shell"^)
- echo Set lnk = objShell.CreateShortcut(WScript.Arguments(0^)^)
- echo WScript.Echo lnk.TargetPath
- ) > "%vbs_script%"
- REM 遍历目录中的所有.lnk文件
- for %%f in ("%target_dir%\*.lnk") do (
- REM 检查路径中是否包含 !
- echo %%f | find "!" >nul
- if errorlevel 1 (
- REM 如果不包含 !,继续处理
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in ('cscript //nologo "%vbs_script%" "%%f"') do (
- set "target_path=%%a"
- )
- REM 检查目标路径是否存在
- if exist "!target_path!" (
- echo 有效: %%f - !target_path!
- ) else (
- echo 无效: %%f - !target_path!
- )
- endlocal
- ) else (
- REM 如果包含 !,跳过并提示
- echo 跳过: %%f - 路径中包含 ! 号
- )
- )
- REM 删除临时 VBScript 文件
- del "%vbs_script%"
- pause
复制代码
作者: 呆萌鼠 时间: 2025-3-1 13:14
本帖最后由 呆萌鼠 于 2025-3-1 13:17 编辑
修改后的代码
- @echo off
- setlocal disabledelayedexpansion
- REM 设置要检查的目录
- set "target_dir=D:\579"
- echo 正在检查目录: %target_dir%
- REM 检查目录是否存在
- if not exist "%target_dir%" (
- echo 错误: 目录 %target_dir% 不存在。
- pause
- exit /b
- )
- REM 创建一个临时的 VBScript 文件来获取快捷方式的目标路径
- set "vbs_script=%temp%\get_target_path.vbs"
- echo 正在创建临时 VBScript 文件: %vbs_script%
- (
- echo Set objShell = CreateObject("WScript.Shell"^)
- echo Set lnk = objShell.CreateShortcut(WScript.Arguments(0^)^)
- echo WScript.Echo lnk.TargetPath
- ) > "%vbs_script%"
- echo 临时文件创建完成。
- REM 检查临时文件是否创建成功
- if not exist "%vbs_script%" (
- echo 错误: 无法创建临时 VBScript 文件。
- pause
- exit /b
- )
- REM 遍历目录中的所有.lnk文件
- for %%f in ("%target_dir%\*.lnk") do (
- REM 禁用延迟变量扩展,避免 ! 被解析
- setlocal disabledelayedexpansion
- set "lnk_path=%%f"
- REM 启用延迟变量扩展,获取目标路径
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in ('cscript //nologo "%vbs_script%" "!lnk_path!"') do (
- set "target_path=%%a"
- )
- REM 检查目标路径是否存在
- if exist "!target_path!" (
- echo 有效: !lnk_path! - !target_path!
- ) else (
- echo 无效: !lnk_path! - !target_path!
- )
- endlocal
- endlocal
- )
- REM 删除临时 VBScript 文件
- echo 正在删除临时 VBScript 文件: %vbs_script%
- del "%vbs_script%"
- echo 临时文件已删除。
- pause
复制代码
作者: 小灰兔 时间: 2025-3-1 14:26
感谢分享
作者: semiuel 时间: 2025-3-1 14:42
你在批处理之家也发了相同的帖子。
大佬也给了答案。
作者: wang1126 时间: 2025-3-1 15:59
谢谢11楼分享
作者: 527104427 时间: 2025-3-1 17:42
本帖最后由 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%"
}
作者: yyz2191958 时间: 2025-3-1 17:43
我再试一试 谢谢
作者: yyz2191958 时间: 2025-3-1 18:36
我慢慢琢磨 谢谢
作者: yyz2191958 时间: 2025-3-1 18:43
放置快捷方式的文件夹路径如果有 英文 ! 号,已经没有问题了
但是,如果快捷方式指向的源文件的路径中有 英文 ! 号,这个快捷方式就被判断为 无效
例如:X:\Users\Default\Desktop\!233\333.txt,这个333.txt.lnk 就判断为 无效
作者: szwp 时间: 2025-3-1 19:26
yyz2191958 发表于 2025-3-1 18:43
放置快捷方式的文件夹路径如果有 英文 ! 号,已经没有问题了
但是,如果快捷方式指向的源文件的路径中 ...
将遍历移入vbs
作者: baolinqiu1 时间: 2025-3-1 19:46
谢谢分享
作者: just002 时间: 2025-3-5 16:16
感谢分享
作者: 创新科技2015 时间: 2025-3-6 11:58
感谢分享
作者: just002 时间: 2025-3-6 14:46
感谢分享
欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) |
Powered by Discuz! X3.3 |