如何用Batch脚本按电子书文件名前缀作者名创建目录并归类文件
电子书批量整理Batch脚本问题解答
现有代码存在的问题
- 未开启延迟变量扩展:你代码中使用了
!变量名!格式的延迟取值,但没有在脚本开头添加setlocal enabledelayedexpansion,导致动态变量取值完全失效,这是运行失败的核心原因 - 目录创建逻辑错误:你写的
MD DName是直接创建名为DName的固定目录,没有调用变量值,正确写法应该是MD "!DName!",同时需要添加2>nul忽略目录已存在的报错 - 字符串截取的动态偏移处理不当:批处理原生字符串截取语法不支持直接将for循环的
%%a变量作为偏移参数,就算开了延迟扩展也需要额外嵌套解析,用循环查找分隔符的方案效率低还容易出错 - 没有处理路径空格问题:所有涉及路径、文件名的变量都需要用英文双引号包裹,否则文件名带空格时命令会执行失败
- 缺少去除作者名字段首尾空格的逻辑,也没有兼容批量处理多文件的能力
批处理字符串截取语法说明
批处理内置的字符串截取语法规则如下:
%变量名:~起始偏移,截取长度% :: 开启延迟扩展时使用以下格式 !变量名:~起始偏移,截取长度!
- 起始偏移从0开始计数,正数为从字符串左侧第n位开始截取,负数为从字符串右侧倒数第n位开始截取
- 截取长度可省略,省略后默认直接截取到字符串末尾
- 偏移量和截取长度只能直接写数字,或者使用经过一层解析的普通变量,不能直接传入for循环的临时变量
%%a这类动态参数
可直接运行的实现脚本
以下脚本完全符合你的需求,兼容两种命名格式,支持批量处理当前目录所有文件,自动处理空格、自动去除作者名首尾空格:
@echo off setlocal enabledelayedexpansion :: 跳过脚本自身,处理当前目录所有文件 for /f "delims=" %%f in ('dir /b /a-d *.* ^| find /v /i "%~nx0"') do ( set "filename=%%~nf" :: 用第一个" - "分割字符串,取前半部分作为作者名 for /f "delims=-" %%a in ("!filename: - =^-!") do ( set "author=%%a" :: 去除首尾空格 for /f "tokens=* delims= " %%b in ("!author!") do set "author=%%b" for /l %%b in (1,1,100) do if "!author:~-1!"==" " set "author=!author:~0,-1!" :: 创建目录,忽略已存在报错 md "!author!" 2>nul :: 移动文件 move "%%f" "!author!\" >nul ) ) echo 整理完成 pause
使用说明
- 将上述代码复制保存为
整理电子书.bat,放到需要整理的电子书根目录 - 双击运行即可,所有文件会自动移动到对应作者名的目录下
内容的提问来源于stack exchange,提问作者Ryouga Hibiki
相关产品推荐
相关产品推荐

