3

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

我已经做到了这一点(我承认不是很远!)..

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

这会成功打印出所有带有扩展名的文件(inc 完整路径),但是如何检查文件扩展名并确保它是小写的(顺便说一下,我不想将文件名设为小写.. 只是扩展名)。

提前致谢 !

格雷格

4

2 回答 2

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) 在文件扩展名可能包含 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!"
)


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%"
于 2012-10-05T16:03:08.750 回答
1

这很匆忙,但可以使用

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

带有开关的dir命令/l将其转换为小写字母,但从我所做的测试来看,它有时有效,但有时无效。

希望这可以由另一个成员改进,但它应该在理论上起作用。

于 2012-10-05T16:02:47.400 回答