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

时间:2012-10-05 15:19:45

标签: windows batch-file

我的目标:使用Windows批处理脚本确保给定目录和子目录中的所有文件都具有小写的文件扩展名

我设法做到这一点(我承认不是很远!)..

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

这会成功打印出所有带扩展名的文件(包含完整路径)但是如何检查文件扩展名并确保它是小写的(我不想让文件名小写,只是扩展名)。

提前致谢!

格雷格

2 个答案:

答案 0 :(得分:8)

完成任务需要2种(可能是3种)技术。

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)如果文件扩展名可能不包含!,则需要在循环内打开和关闭延迟扩展。但我非常怀疑你会遇到这种情况。

这是一个完整的,有效的脚本,忽略了第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!"
)


巴厘岛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 :(得分:1)

这很匆忙,但可以使用

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

使用dir开关的/l命令将其转换为小写,但是从测试开始我有时会工作而不是其他工作。

希望这可以由另一位成员改进,但它应该在理论上有效。