Windows批处理文件 - 对于给定目录及其子目录中的所有文件 - 将文件扩展名更改为小写

3

我的目标:使用Windows批处理脚本确保给定目录及其子目录中的所有文件扩展名均为小写。

我已经做到了这一点(我承认还不够远)...

for /R c:\test %%G in (*.*) do (
  echo %%G
)

这成功地打印出了所有带扩展名的文件(包括完整路径),但我如何检查文件扩展名并确保它是小写的(顺便说一下,我不想使文件名变成小写...只想让扩展名变成小写)。
提前感谢!
Greg
2个回答

8

你需要掌握两种(可能三种)技术来完成任务。

1)你需要解析出文件名和文件扩展名,这很简单,如FOR HELP中所述。(从命令行键入HELP FOR

  • %%~nG = 文件名
  • %%~xG = 文件扩展名

2)你需要将每个文件扩展名存储在变量中,然后使用以下代码将其转换为小写。

for %%C in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "ext=!ext:%%C=%%C!"

你需要在脚本开头使用setlocal enableDelayedExpansion启用延迟扩展。
上述代码起作用的原因是搜索部分对大小写不敏感。
3) 在不太可能出现文件扩展名中包含!的情况下,你需要在循环内切换延迟扩展。但我真的不认为你会遇到这种情况。
以下是一个已完成且功能正常的脚本,忽略第三点。
@echo off
setlocal enableDelayedExpansion
for /r "c:\test" %%F in (*) do if "%%~xF" neq "" (
  set "ext=%%~xF"
  for %%C in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "ext=!ext:%%C=%%C!"
  ren "%%F" "%%~nF!ext!"
)


Bali C在他的回答中提出了一个有趣的想法,但它并没有完全奏效。我通过在临时文件夹中创建一个只由文件扩展名组成的临时文件来使其工作。但它比上面的解决方案要慢。

@echo off
setlocal
set "folder=%temp%\ren%random%"
md "%folder%"
for /r "c:\test" %%F in (*) do if "%%~xF" neq "" (
  copy nul "%folder%\%%~xF" >nul
  for /f "delims=" %%X in ('dir /b /l "%folder%"') do ren "%%F" "%%~nF%%X"
  del /q "%folder%"
)
rd "%folder%"

1

这个很仓促,但可以作为工作的基础

for /r C:\Folder %%a in (*) do (
    for /f %%s in ('dir /b /l %%a') do (
        ren %%a %%~na%%~xs
    )
)

dir 命令加上 /l 开关可以将其转换为小写,但根据我所做的测试,它有时有效,有时无效。

希望其他成员能够改进它,但理论上应该是可行的。


有趣的想法,但 %%~xs 展开为文件名的本地大小写。由 DIR /L 生成的小写将丢失。 - dbenham
+1;虽然你的代码不起作用,但它是我答案中第二个可行解决方案的基础。 - dbenham
是的,我无法弄清楚如何保留dir创建的版本,我考虑使用临时文件,但是无法理解 :) - Bali C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接