批处理脚本优先查找带(2)后缀的目标.exe文件的修改方案咨询
批处理脚本优先查找带(2)后缀的目标.exe文件的修改方案咨询
嗨,我来帮你搞定这个问题~ 你当前遇到的核心问题有两个:一是直接用find /i "(%pc%)(2).exe"时,括号在find命令里属于正则特殊字符,会被解析成分组符号而非字面括号;二是需要实现优先找带(2)后缀的文件,找不到再用原版的逻辑。
下面是修改后的完整批处理脚本,我会在后面拆解关键修改点:
Setlocal EnableDelayedExpansion :scan Echo Auto-Detect Source set pc=DS-15-103-W goto pcname :pcname REM Locate the Drive contains the folder-"Site Information" set mydrive=NOT_FOUND for /f "skip=1" %%G in ('wmic logicaldisk get name') do ( if exist "%%G\Site Information" set mydrive=%%G ) echo Possible USB Drive is %mydrive% if %mydrive%==NOT_FOUND (goto nas) else (goto check) :check REM 优先查找带(2)后缀的目标文件 set "pathdrive=NOT_FOUND" REM 关键:find命令中括号需要用^转义,否则会被当作正则元字符 for /f "tokens=* delims=\" %%a in ('dir "%mydrive%" /s /b ^| find /i "(%pc%^)^(2^).exe"') do set "pathdrive=%%~dpnxa" REM 如果没找到带(2)的,再查找原版文件 if "%pathdrive%"=="NOT_FOUND" ( for /f "tokens=* delims=\" %%a in ('dir "%mydrive%" /s /b ^| find /i "(%pc%^).exe"') do set "pathdrive=%%~dpnxa" ) echo The file path is %pathdrive% if "%pathdrive%"=="NOT_FOUND" (goto nas) else (goto extract) :extract REM Run file extraction(修正了原脚本的引号错位问题) "%pathdrive%" /s /x /b "%systemdrive%" /v /qn echo %errorlevel% pause
关键修改说明
转义正则特殊字符
find命令默认支持简单正则,(和)是分组元字符,必须用^转义成^(^),这样find才会把它们当作普通括号匹配。比如"(%pc%^)^(2^).exe"会精准匹配(DS-15-103-W)(2).exe这类文件名。实现优先查找逻辑
先尝试匹配带(2)的文件,只有当结果还是NOT_FOUND时,才会执行原版文件的查找,完美满足你“有(2)版本就用它,没有就用原版”的需求。修正提取命令语法
原脚本的提取命令有引号错位问题,我调整为"%pathdrive%" /s /x /b "%systemdrive%" /v /qn,确保参数的引号包裹正确,避免执行出错。
额外小提示
- 如果确定目标文件只在U盘根目录,可去掉
dir命令里的/s参数,减少遍历子目录的时间。 - 因为启用了
EnableDelayedExpansion,如果文件名里包含!符号可能会有解析问题,但你的场景里应该不会遇到这种情况,暂时无需额外处理。
备注:内容来源于stack exchange,提问作者VB88
相关产品推荐
相关产品推荐

