批处理脚本排除文件条件失效、数字开头文件归类实现问题
批处理文件分类脚本问题修正方案
你当前脚本的两个问题可按如下方式排查修正:
问题1:排除列表判断失效的原因与修复
原写法存在两处语法错误:
- 批处理
set命令赋值时,变量名、等号、变量值之间不能加空格。你写的set noms = gamelist.bmp test.gif truc.pdf实际会创建名为noms(末尾带空格)的变量,后续引用%noms%时根本取不到预设的排除文件列表。 - cmd的
if语句原生不支持in关键字做列表包含判断,IF NOT "%%A" in %noms%属于不符合语法规则的写法,无法被正确解析执行。
修正逻辑:给排除列表前后加统一分隔符(比如分号),通过findstr做精确匹配判断即可,避免文件名部分匹配的误判问题。
问题2:数字开头文件归集到0-9文件夹的实现
该需求可通过正则判断首字符实现:提取文件名首字符后,用正则匹配判断是否为0-9的数字,若匹配则将目标文件夹设置为0-9,否则沿用首字符作为文件夹名。
修正后完整脚本代码
@echo off setlocal EnableDelayedExpansion :: 配置不需要移动的文件列表,文件名前后用分号包裹 set "noms=;gamelist.bmp;test.gif;truc.pdf;" FOR /F "tokens=*" %%A in ('DIR /B /A:-D "%cd%\*"') do ( :: 跳过脚本自身 IF /I NOT "%%A"=="%~nx0" ( :: 判断当前文件是否在排除列表中 echo !noms!|findstr /i /c:";%%A;" >nul IF errorlevel 1 ( set "FIRSTCHAR=%%~nA" set "FIRSTCHAR=!FIRSTCHAR:~0,1!" :: 判断首字符是否为数字 echo !FIRSTCHAR!|findstr /r "^[0-9]$" >nul IF not errorlevel 1 ( set "TARGETDIR=0-9" ) ELSE ( set "TARGETDIR=!FIRSTCHAR!" ) :: 创建目标文件夹并移动文件 IF NOT EXIST "%cd%\!TARGETDIR!" MD "%cd%\!TARGETDIR!" MOVE "%cd%\%%A" "%cd%\!TARGETDIR!\" >nul ) ) ) endlocal
补充说明:代码中
>nul是为了屏蔽命令执行的默认输出,不需要可以删除;/i参数是忽略文件名大小写匹配,可根据需求调整。
内容的提问来源于stack exchange,提问作者Tooonyo
相关产品推荐
相关产品推荐

