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

Gre*_*Cox 3 windows batch-file

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

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

for /R c:\test %%G in (*.*) do (
  echo %%G
)
Run Code Online (Sandbox Code Playgroud)

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

提前致谢 !

格雷格

dbe*_*ham 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!"
Run Code Online (Sandbox Code Playgroud)

您需要setlocal enableDelayedExpansion在脚本顶部启用延迟扩展.

上述工作原因是搜索和替换的搜索部分不区分大小写.

3)在不太可能的情况下,文件扩展名可能包含a !,您需要在循环内打开和关闭延迟扩展.但我严重怀疑你会遇到这种情况.

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


巴厘岛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%"
Run Code Online (Sandbox Code Playgroud)