代码之家  ›  专栏  ›  技术社区  ›  Ghoul Fool

批量重命名扩展名为小写

  •  1
  • Ghoul Fool  · 技术社区  · 7 年前

    我可以重命名的文件夹。TXT文件的小写扩展名,带有

    ren *.TXT *.txt
    

    我试过:

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

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

    失败得更好。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Magoo    7 年前
    @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 (a完全 变量)获取小写等效值,因为 /l dir 命令


    在Aacini的响应之后,进行了更广泛的测试(实际上是尝试重命名文件,而不仅仅是生成一个重命名指令,该指令可以

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

    理论上很好。问题是 ~x

    所以我给一个变量命名并尝试处理 那个 . 重复移除之前的字符串 .

    然后从文件名中删除扩展名,但不能使用“无替换”方法,因为文件名可能是 whatever.txt.txt

    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
    
        2
  •  2
  •   user6811411 user6811411    7 年前

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

    powershell -nop -c "gci -file|ren -newname {$_.BaseName+($_.Extension.ToLower())}"
    
        3
  •  2
  •   Aacini    7 年前

    只需添加 到您的原始代码: 获取分机。 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 每个扩展名而不是每个文件的命令。以下是步骤: 获取全部 字符串中的文件扩展名。 2. 3. 使用此字符串中的每个扩展名执行

    @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"