递归重命名文件和文件夹

时间:2012-03-06 12:09:05

标签: batch-file cmd

我已阅读this帖子,但无法满足我的要求。

我的文件夹结构是:

_TEMPLATE_
|_ _TEMPLATE_SUBFOLDER1
|   |_ _TEMPLATE_SUB_SUBFOLDER1
|   |   |_ _TEMPLATE_FILE11.txt
|   |   |_ _TEMPLATE_FILE12.xml
|   |_ _TEMPLATE_SUB_SUBFOLDER2
|   |   |_ _TEMPLATE_FILE21.txt
|   |   |_ _TEMPLATE_FILE22.xml
|   |_ TEMPLATE_SUB_SUBFOLDER3
|_ _TEMPLATE_SUBFOLDER2
    |_TEMPLATE_FILE3.xml

我想将_TEMPLATE_替换为所需名称 对于前Stores所以结果将是

Stores
|_ StoresSUBFOLDER1
|   |_ StoresSUB_SUBFOLDER1
|   |   |_ StoresFILE11.txt
|   |   |_ StoresFILE12.xml
|   |_ StoresSUB_SUBFOLDER2
|   |   |_ StoresFILE21.txt
|   |   |_ StoresFILE22.xml
|   |_ StoresSUB_SUBFOLDER3
|_ StoresSUBFOLDER2
    |StoresFILE3.xml

我在网上搜索了只有遍历文件的选项。并且没有一个递归重命名 谢谢。

1 个答案:

答案 0 :(得分:4)

未经测试,但我认为这会有效

@echo off
setlocal disableDelayedExpansion
for /f "delims=" %%F in ('dir /b /ad /s _TEMPLATE_*') do (
  set "fname=%%~nxF"
  set "fpath=%%~dpF"
  setlocal enableDelayedExpansion
  ren "!fpath:_TEMPLATE_=Stores!!fname!" "!fname:_TEMPLATE_=Stores!"
  endlocal
)

这可能有点棘手,因为循环正在修改它枚举的层次结构的文件夹名称。每个文件夹的父文件夹在到达目的地时已经被重命名。

如果未重命名的根路径名称中也包含_TEMPLATE_,则无法提供正确的结果。

我在循环内切换延迟扩展,以防止在扩展FOR变量期间路径名中!的损坏。如果您知道没有文件夹名称包含!,那么您可以在顶部使用SETLOCAL EnableDelayedExpansion并从循环中删除SETLOCAL和ENDLOCAL。