【问题标题】:Batch: Move all files from multiple subfolders (same name) into the parent批处理:将所有文件从多个子文件夹(同名)移动到父文件夹
【发布时间】:2018-07-25 10:50:30
【问题描述】:

我刚刚开始使用批处理文件并遇到了问题。 我需要将具有相同名称(旧)的多个文件夹中的所有文件移动到父文件夹中。 如果我只为 1 个文件夹执行此操作,但我无法弄清楚如何同时为多个文件夹执行此操作,则效果很好。我会很感激一些帮助。这是我的文件夹结构:

  • 文件夹\1\old\somefiles => 文件夹\1\somefiles
  • 文件夹\2\old\somefiles => 文件夹\2\somefiles
  • 文件夹\3\old\somefiles => 文件夹\3\somefiles

这是我的一个文件夹的代码:

for %%F in ( c:\test\folder\120006\old\*.*) do move /Y %%F c:\test\folder\120006

感谢您的帮助

【问题讨论】:

  • for %%F in ("C:\test\folder\120006\old\*.*") do move /Y "%%~F" "%%~dpF.."~dp 修饰符返回文件父目录的完整路径,.. 上一级)
  • @aschipfl 不能递归工作。
  • 我的评论提出了一种避免将目标指定为常量的方法,但仅此而已;很抱歉不清楚!对于你需要这样做:for /D %%D in ("C:\test\folder\*") do for %%F in ("%%~D\old\*.*") do move /Y "%%~F" "%%~dpF.."

标签: batch-file


【解决方案1】:

由于似乎要处理的文件以及更改的目录始终位于相同的相应目录层次结构级别,因此以下代码应该符合您的预期:

rem // Iterate over the changing directories:
for /D %%D in ("C:\test\folder\*") do (
    rem // Iterate over the files to process:
    for %%F in ("%%~D\old\*.*") do (
        rem // Actually move the files one level up:
        move /Y "%%~F" "%%~dpF.."
    )
)

除非真的需要,否则我不会使用递归 (for /R)。

【讨论】:

  • 感谢这完美的作品。你能告诉我如何只让某些(不是全部)文件被移动吗?仅当父文件夹中还没有任何文件时才应移动它们。 @aschipfl
  • 您可以执行dir /A:-D > nul 2>&1 && move /Y "%%~F" "%%~dpF.."dir 命令在找不到文件 (/A:-D) 的情况下返回错误;> nul 2>&1 抑制 dir 的任何输出;&& 让以下命令仅在没有错误的情况下执行)
  • 我试过这样但没有用。有任何想法吗? @aschipfl rem // Iterate over the changing directories: for /D %%D in ("C:\test\folder\*") do ( rem // Iterate over the files to process: for %%F in ("%%~D\old\*.*") do ( rem // Actually move the files one level up: dir /A:-D > nul 2>&1 && move /Y "%%~F" "%%~dpF.." ) )
  • 您需要为dir 提供路径,如下所示:dir /A:-D "%%~D"(我在之前的评论中错过了这一点,抱歉!)
  • 这只是follow-up question的链接...
【解决方案2】:

在命令行使用:

 for /r X:\Folder /d %F in (old.?) do @move "%F\*" "%~dpF"

在批处理文件中:

@Echo off
for /r X:\Folder /d %%F in (old.?) do move "%%F\*" "%%~dpF"

之前我的 ramdrive 上的示例树:

> tree /F
Auflistung der Ordnerpfade für Volume RamDisk
└───Folder
    ├───1
    │   └───old
    │           somefiles
    ├───2
    │   └───old
    │           somefiles
    └───3
        └───old
                somefiles

运行命令后:

> tree /f
Auflistung der Ordnerpfade für Volume RamDisk
└───Folder
    ├───1
    │   │   somefiles
    │   └───old
    ├───2
    │   │   somefiles
    │   └───old
    └───3
        │   somefiles
        └───old

如果在Folder 下的树中有任何其他名为OLD 的文件夹,其文件应该上移一级- 使用 aschipl 的解决方案,否则更喜欢更简单的解决方案。

【讨论】: