|
|
本帖最后由 aloha20200628 于 2026-6-21 17:21 编辑
从很多老帖中处理文件名的种种方法可见,采用 call 或 goto 方法的遍历效率明显低于采用 for /L 方法,但很多具体应用代码中采取 for /L 循环上限的方法很随意。
其实直接采用系统规范单个文件名(不含路径)的最大长度(255个字符)给 for /L 循环量定限,是一个不错的选择,类似于计算字符串长度的经典算法所取的字符串变量最大长度(8KB 字节量)。
如此定限的 for /L 方法,其运行效率明显高于那些采用 call 或 goto 的遍历方法,示例代码可见 https://bbs.bathome.net/thread-1251-1-1.html 22楼。
若还可选择系统内置的其他脚本,如 jscript,powershell 中的正则替换方法,当然代码运行效能会更加精进,尤其是用于数据量较大的实况。
以下是针对上述老帖一楼题目的两个示例代码,powershell 版本和 jscript 版本,前者将 '文件名正则替换+文件批量更名' 一气呵成,后者仅用 jscript 完成文件名正则替换...
重命名-p.bat
- @echo off &powershell -c "dir -file * -exclude '%~nx0'|%%{ $f=($_.basename -replace '[^a-z]', '')+$_.extension; """ren $_ $f"""; }" &exit/b
复制代码
重命名-j.bat
- 2>1/* :: REM 删除文件名中非英文字母以外的所有字符
- @echo off &for %%F in (*) do if "%%~nxF" neq "%~nx0" (for /f "delims=" %%f in ('cscript /nologo /e:jscript "%~f0" "%%~nF" ') do ren "%%F" "%%f%%~xF" )
- exit/b */
- v=WSH.arguments, WSH.echo(v(0).replace(/[^a-z]/ig,'')), WSH.quit();
复制代码 |
|