批量重命名扩展为小写

时间:2017-09-04 20:57:44

标签: windows batch-file file-rename batch-rename

我可以使用

将.TXT文件的文件夹重命名为小写扩展名
ren *.TXT *.txt

但那是因为我知道扩展,其中只有一个扩展。是否有一个用于循环目录并将所有扩展名更改为小写的内容?

我试过了:

for %%f in (*.*) do (rename "%%f" "%%~xf")

这在某种程度上有效,但它也删除了文件名部分。 d'!哦

更好地失败。

3 个答案:

答案 0 :(得分:3)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"

FOR /f "delims=" %%A IN (
 'dir /b /a-d "%sourcedir%\*" '
 ) DO (
 FOR /f "delims=" %%a IN (
  'dir /b /l "%sourcedir%\%%A" '
  ) DO (
  if "%%~xa" neq "%%~xA" ECHO REN "%sourcedir%\%%A" "%%~nA%%~xa"
)
)

GOTO :EOF

当然,如果需要,可以将两个嵌套的for命令压缩到一行 - 为了便于阅读,这里显示在多行上。

您需要更改sourcedir的设置以适合您的具体情况。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO REN更改为REN以实际重命名文件。

请注意%%A保留原始字符大小写,但%%a(一个完全不同的变量)获取小写等效项,因为/l切换在dir命令。

根据Aacini的回复,更广泛的测试(好吧,实际上尝试重命名文件而不是仅仅生成应该乍一看工作的重命名指令)显示这实际上不起作用,可能是因为操作系统将文件重命名为自己的名称(忽略大小写)。哼。

所以 - 第一步是重命名两次 - 首先重命名为虚拟名称,然后从虚拟名称重命名为所需名称。

理论上很好。问题是~x运算符似乎没有一致地报告相同的字符串 - 几乎取决于它使用了多少次。所以 - 我尝试执行一个子程序,传递“to”和“from”文件名。尝试访问参数的名称片段时,子例程似乎有同样的问题。阴霾。

所以我将名称分配给变量并尝试处理 。重复删除名称中.之前的字符串,直到没有更多的点,并且您有扩展名。

然后从文件名中删除扩展名,但不能使用replace-with-nothing方法,因为文件名可能是whatever.txt.txt。因此,在循环内逐个删除最后几个字符,找到扩展的长度+ 1(对于点)。

所以 - 如果找到的扩展名的小写版本与ext2中的当前案例版本相同,则不需要重命名。否则,重命名为原始案例名称+小写扩展名。通过虚拟名称来确保操作系统不会过于聪明。

这是结果。当然,除了通常的字符意外结果。

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
:choosedummy
SET "dummyname=dummyname.%random%"
IF EXIST "%sourcedir%\%dummyname%" GOTO choosedummy

FOR /f "delims=" %%A IN (
 'dir /b /a-d "%sourcedir%\*" '
 ) DO (
 FOR /f "delims=" %%a IN (
  'dir /b /l "%sourcedir%\%%A" '
  ) DO CALL :casechg "%%a" "%%A"
)

GOTO :EOF

:casechg
SET "ext2=%~2"
SET "name2=%~2"
:ext2loop
IF "%ext2%" neq "%ext2:*.=%" SET "ext2=%ext2:*.=%"&GOTO ext2loop

:: if extension cases are identical, or no extension, skip rename
IF "%~x1" equ "" GOTO :EOF 
IF "%~x1" equ ".%ext2%" GOTO :EOF 

SET "lop=%ext2%"
:loploop
SET "name2=%name2:~0,-1%"
IF DEFINED lop SET "lop=%lop:~1%"&GOTO loploop

REN "%sourcedir%\%~2" "%dummyname%"
REN "%sourcedir%\%dummyname%" "%name2%%~x1"
GOTO :eof

答案 1 :(得分:1)

可以使用纯批次但很笨拙。

我建议使用cmdline / batch包装的PowerShell脚本:

powershell -nop -c "gci -file|ren -newname {$_.BaseName+($_.Extension.ToLower())}"

答案 2 :(得分:1)

只需将两行添加到原始代码中: 1. 获取扩展程序。 2。将其转换为小写。

@echo off
setlocal EnableDelayedExpansion

for %%f in (*.*) do (
   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!"
)

编辑:以下新方法可以在没有扩展名的文件时正确管理案例。此方法也更有效,因为它只将一个字符串转换为小写,并为每个扩展名而不是每个文件执行ren命令。以下是步骤: 1. 在字符串中获取所有不同的文件扩展名。 2. 将此字符串转换为小写。 3。使用此字符串中的每个扩展名执行ren命令。

@echo off
setlocal EnableDelayedExpansion

set "exts= "
for %%f in (*.*) do if "!exts:%%~Xf=!" equ "!exts!" set "exts=!exts! %%~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 "exts=!exts:%%c=%%c!"
for %%e in (%exts%) do ren "*%%e" "*%%e"