批量移动文件从子文件夹到父文件夹

时间:2013-11-19 19:54:13

标签: batch-file

所以这是我的情景。

这是我的文件夹结构

C:\DOCS\Project1\docname1\image.jpg
                \docname2\image.jpg
                \docname3\image.jpg
C:\DOCS\Project2\docname1\image.jpg
                \docname2\image.jpg
                \docname3\image.jpg

我试图让#b; DOCS"文件夹,并将所有image.jpgs从" docname"移出一个文件夹。文件夹到""项目"文件夹中。

docname和项目名称都不同,并遵循特定的命名方案,所以我不能只使用source和dest目录。

它必须是能够找到image.jpg并将其移动到父文件夹的东西。

这就是我所拥有的,但它无法正常工作。

for /d %f in (docs\*) do (
pushd %f
copy .\*.jpg ..
popd
)

此外,我只需要每个项目文件夹中的一个.jpgs。所以更换/重命名不是问题。

3 个答案:

答案 0 :(得分:1)

@echo off
setlocal enabledelayedexpansion

for /f "tokens=*" %%a in ('dir /A:D /S /B "C:\docs\*"') do (
    for %%y in ("%%a\*.jpg") do (
        call :GETPARENTPARENT "%%y" ret

        echo ret=!ret!
        move /Y "%%y" "!ret!"
    )
)

goto:EOF

:GETPARENTPARENT
set fileP=%1
echo received=%fileP%
for %%a in (%fileP%) do (
    set parent=%%~dpa
    cd !parent!\..
    set PPPath=!cd!
    for %%x in ("!PPPath!") do (
        set "%~2=%%~dpnx"
    )
)
GOTO:EOF

答案 1 :(得分:0)

在bat文件中,循环变量指定为%% f而不是%f

所以你应该改成

for /d %%d in (docs\*) do (
  pushd %%d
  ...

但您想要递归到目录树中,只检查docname *文件夹

所以你应该改为

for /d /r %%d in (docname*) do (
  pushd %%d
  ....

然后你必须将你的.jpg文件移动一个目录,并使用带有/ y选项的move命令来避免文件名可能的冲突

所以你的蝙蝠最终变成了

for /d /r %%d in (docname*) do (
  pushd %%d
  move /y *.jpg ..
  popd
)

答案 2 :(得分:0)

此回声将命令移动到屏幕 - 如果它们与您需要执行的操作匹配,则删除echo并运行它。它侧重于c:\docs及以下的所有JPG文件。

此处..表示向上移动一级到父文件夹。

@echo off
pushd "C:\DOCS"
    for /f "delims=" %%a in ('dir *.jpg /a-d /b /s') do echo move /y "%%a" ..
popd
pause