CMD脚本编写求助:如何排除已复制文件实现分类复制
CMD脚本修复:按规则分类复制System32文件
修复后的完整脚本
@echo off setlocal enabledelayedexpansion echo 请输入主文件夹名称 set /P main= echo 请输入子文件夹前缀名称 set /P subfolder= :: 清理已存在的主文件夹(不存在则忽略报错) rd /s /q "C:\Users\tomek\Desktop\%main%" 2>nul :: 创建主文件夹及10个子文件夹 mkdir "C:\Users\tomek\Desktop\%main%" for /L %%D in (1,1,10) do ( mkdir "C:\Users\tomek\Desktop\%main%\%subfolder%_%%D" ) :: 复制a开头的DLL到第1个子文件夹 for %%Z in ("C:\Windows\System32\a*.dll") do ( copy "%%Z" "C:\Users\tomek\Desktop\%main%\%subfolder%_1" ) :: 复制b开头的DLL到第2个子文件夹 for %%X in ("C:\Windows\System32\b*.dll") do ( copy "%%X" "C:\Users\tomek\Desktop\%main%\%subfolder%_2" ) :: 复制剩余DLL到第10个子文件夹(排除a、b开头的文件) for %%Y in ("C:\Windows\System32\*.dll") do ( set "filename=%%~nY" if not "!filename:~0,1!"=="a" if not "!filename:~0,1!"=="b" ( copy "%%Y" "C:\Users\tomek\Desktop\%main%\%subfolder%_10" ) ) endlocal
关键修改说明
- 开启延迟变量扩展:添加
setlocal enabledelayedexpansion,解决for循环内动态变量解析失败的问题,原来的脚本缺少这一步导致首字符判断失效。 - 调整文件夹清理时机:把删除旧文件夹的命令移到用户输入主文件夹名称之后,避免变量未赋值引发的错误,同时用
2>nul屏蔽不存在文件夹时的报错信息。 - 统一绝对路径:所有文件操作都使用完整绝对路径,避免相对路径带来的定位混乱,确保脚本在任意目录执行都能正常工作。
- 完善排除逻辑:最后一步同时判断排除
a和b开头的文件,用两个if not串联实现双重过滤,确保只复制未被分类的剩余文件。 - 优化变量提取:先将文件名提取到单独变量中再做首字符判断,让代码逻辑更清晰易读。
内容的提问来源于stack exchange,提问作者emdez
相关产品推荐
相关产品推荐

