所以这是我的情景。
这是我的文件夹结构
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。所以更换/重命名不是问题。
答案 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