我的目标:使用Windows批处理脚本确保给定目录及其子目录中的所有文件扩展名均为小写。
我已经做到了这一点(我承认还不够远)...
for /R c:\test %%G in (*.*) do (
echo %%G
)
这成功地打印出了所有带扩展名的文件(包括完整路径),但我如何检查文件扩展名并确保它是小写的(顺便说一下,我不想使文件名变成小写...只想让扩展名变成小写)。
提前感谢!
Greg
我的目标:使用Windows批处理脚本确保给定目录及其子目录中的所有文件扩展名均为小写。
我已经做到了这一点(我承认还不够远)...
for /R c:\test %%G in (*.*) do (
echo %%G
)
你需要掌握两种(可能三种)技术来完成任务。
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
启用延迟扩展。!
的情况下,你需要在循环内切换延迟扩展。但我真的不认为你会遇到这种情况。@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%"
这个很仓促,但可以作为工作的基础
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 生成的小写将丢失。 - dbenhamdir
创建的版本,我考虑使用临时文件,但是无法理解 :) - Bali C