【问题标题】:How to recursively change filenames for upper to lower case through bat file如何通过bat文件递归地将文件名从大写更改为小写
【发布时间】:2016-11-24 21:57:18
【问题描述】:

我一直在扩展这里解决的问题:https://superuser.com/questions/65302/is-there-a-way-to-batch-rename-files-to-lowercase/412413#412413

我希望将文件名从大写更改为小写,并且由于文件存储在多个文件夹中,我希望以递归方式进行。

我尝试了以下方法:

setlocal EnableDelayedExpansion
CD /D "somefolder"
FOR /D %%G in (*) DO (
FOR /F "Tokens=*" %%f in ('DIR %%G /l/b/a-d') DO (RENAME "%%f"  "%%f")) 

我得到“系统找不到指定的路径错误”。 我确信我忽略了一些明显的东西。

【问题讨论】:

    标签: windows loops batch-file recursion


    【解决方案1】:

    您的代码给出了路径错误,因为 RENAME 找不到该文件。 DIR 命令列出子目录中的文件,但您的当前目录不是子目录。

    您还有其他问题 - 您没有进行递归文件夹搜索。 /D 选项仅列出直接子文件夹。您的代码会丢失根“somefolder”中的文件,以及任何两层或更多层深的文件夹。

    另外,来自 SuperUser 的原始代码存在缺陷。使用"tokens=*" 将去掉前导空格。文件名可能(但不太可能)以空格开头,然后代码会中断。一种正确的语法是for /f "eol=: delims=" ...

    使用dir /s 选项的MichaelS answer 无法工作,因为REN 命令不接受目标中的路径信息——只能使用文件名和扩展名。通常你会使用%%~nxF 来解决这个问题,但这会恢复到文件名的原始大小写!

    这是一个在命令行上使用的合适的递归解决方案:

    for /r "somePath" %D in (.) do @for /f "eol=: delims=" %F in ('dir /l/b/a-d "%D"') do @ren "%D\%F" "%F"
    

    从一个批处理脚本

    @echo off
    for /r "somePath" %%D in (.) do for /f "eol=: delims=" %%F in ('dir /l/b/a-d "%%D"') do ren "%%D\%%F" "%%F"
    

    如果您愿意超越本机 cmd.exe 命令,那么另一个选项是我的JREN.BAT regular expression renaming utility,它支持将名称转换为大写或小写的选项。它是纯脚本(混合 JScript/批处理),可以在 XP 以后的任何 Windows 机器上本地运行 - 不需要第 3 方 exe 文件。完整的文档是内置的 - 通过jren /?jren /?? 从命令行访问,如果您想要分页输出。

    使用 JREN,递归解决方案非常简单:

    jren "^" "" /s /l
    

    【讨论】:

      【解决方案2】:

      您不需要遍历子目录。只需在 dir 命令中添加/s

      FOR /F "Tokens=*" %%f in ('DIR /l/b/a-d/s') DO (RENAME "%%f"  "%%f")
      

      /s 将递归包含所有子文件夹。

      【讨论】:

      • 不幸的是,这不起作用。 “不需要遍历子目录”是什么意思?我应该跳过以 FOR /D 开头的行吗?
      • 我认为这条线应该是这样的:for /F "tokens=*" %%F in ('dir /S /B /L /A:-D "%%~G"') do rename "%%~F" "%%~nxF")
      • 跳过第一个 FOR 循环。我发布的代码行应该足够了。您也可以跳过setlocal EnableDelayedExpansion,因为您没有使用延迟扩展,至少在这部分代码中没有。
      • 抱歉,刚刚注意到我的代码中有一个错误。我已经修改了它,所以现在它应该可以工作了。 %%G 错了。
      • @MichaelS。您的代码 FOR /F "Tokens=*" %%f in ('DIR /l/b/ad/s') DO (RENAME "%%f" "%%f") 导致“命令的语法是不正确”。这似乎是由于 /s。
      猜你喜欢
      • 1970-01-01
      • 2014-02-02
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      相关资源
      最近更新 更多