![将文件从父文件夹移动到子文件夹](https://linux22.com/image/1534509/%E5%B0%86%E6%96%87%E4%BB%B6%E4%BB%8E%E7%88%B6%E6%96%87%E4%BB%B6%E5%A4%B9%E7%A7%BB%E5%8A%A8%E5%88%B0%E5%AD%90%E6%96%87%E4%BB%B6%E5%A4%B9.png)
我正在尝试通过批处理文件修复以下问题。
test
是一个父文件夹,其中包含进一步的子文件夹test1
、、test2
。test3
所有这些子文件夹test1
、、test2
都test3
包含一些.docx
文件和进一步的子文件夹存档。
- 在子文件夹、、中查找现有
.docx
文件。test1
test2
test3
- 将它们复制到名为 的所需文件夹中
destination
。
以下代码对于问题的第一部分来说工作正常:
for /R "C:\test" %%f in (*.docx) do xcopy %%f "C:\Users\%USERNAME%\Desktop\destination\" /exclude:c:\test\not_required.txt
现在我想将.docx
文件从子文件夹test1
、test2
移动test3
到其各自的子文件夹存档。到目前为止,我只能为问题的第二部分构建以下代码。
for /d /r "c:\test" %%a in (*) do (
if /i "%%~nxa"=="archiv" set "folderpath=%%a"
move "C:\test\test1\test1.docx" "%folderpath%"
)
如您所见,我已为源文件提供了静态文件移动C:\test\test1\test1.docx
。我不确定如何在循环内使用更多变量,不幸的是,它无法按预期工作。非常感谢一些专家的建议。
答案1
您的方法的问题在于For /R
也会深入到存档文件夹,因此必须避免这种情况。
如果您的文件夹结构没有不同的深度,您可以使用带通配符的 for /d 来仅获取直接子文件夹C:\test
以此示例情况为例:
> tree /F
C:\
├───Test
│ ├───test1
│ │ │ Example_8192.docx
│ │ │ Example_32457.docx
│ │ │
│ │ └───archive
│ ├───test2
│ │ │ Example_14218.docx
│ │ │ Example_20916.docx
│ │ │
│ │ └───archive
│ └───test3
│ │ Example_12174.docx
│ │ Example_9168.docx
│ │
│ └───archive
└───Users
└───UserName
└───Desktop
└───Destination
此批次使用变量修饰符:
:: C:\Copy+Archive.cmd
@Echo off
For /D %%D in ("C:\test\*") do (
Echo Processing %%D
For %%F in ("%%~fD\*.docx") do (
Echo Copying "%%~fF" "C:\Users\%USERNAME%\Desktop\Destination\"
xcopy "%%~fF" "C:\Users\%USERNAME%\Desktop\Destination\" >Nul && (
Echo Moving "%%~fF" "%%~dpFarchive\"
Move "%%~fF" "%%~dpFarchive\" >Nul
)
)
)
将产生此结果
> tree /f
C:\
│ Copy+Archive.cmd
│
├───Test
│ ├───test1
│ │ └───archive
│ │ Example_8192.docx
│ │ Example_32457.docx
│ │
│ ├───test2
│ │ └───archive
│ │ Example_14218.docx
│ │ Example_20916.docx
│ │
│ └───test3
│ └───archive
│ Example_12174.docx
│ Example_9168.docx
│
└───Users
└───UserName
└───Desktop
└───Destination
Example_8192.docx
Example_32457.docx
Example_14218.docx
Example_20916.docx
Example_12174.docx
Example_9168.docx