Batch file 如何将具有特定扩展名的文件从子目录移动到另一个目录,包括使用CMD创建文件的子目录?

Batch file 如何将具有特定扩展名的文件从子目录移动到另一个目录,包括使用CMD创建文件的子目录?,batch-file,cmd,Batch File,Cmd,目录C:\Parent包含两个子目录 \basis //contains folders which contain .pdf and .txt files \basis_ft //empty 我想将所有*.txt文件从\basis移动到\basis\u ft,但它们必须位于与以前完全相同的子目录中 之前: 之后: 有很多像UD00这样的子目录,其中包含不同数量的文件 我目前的发言如下: for /r "C:\Parent\basis\" %%x in

目录C:\Parent包含两个子目录

\basis             //contains folders which contain .pdf and .txt files
\basis_ft          //empty
我想将所有*.txt文件从\basis移动到\basis\u ft,但它们必须位于与以前完全相同的子目录中

之前: 之后: 有很多像UD00这样的子目录,其中包含不同数量的文件

我目前的发言如下:

for /r "C:\Parent\basis\" %%x in (*.txt) do move "%%x" "C:\Parent\basis_ft"
但这只能将所有*.txt文件取出并放入文件夹中

你们有谁知道怎么做吗


我想补充一点,我更愿意在一条语句中这样做,而不首先创建一个列出所有所需内容的文本文件,另一个文件使用该文件创建目录,然后移动文件。最后,还有一个文本文件需要删除。我已经这样做了,但我渴望简化这个过程,因为我需要经常这样做。

这个目录创建和文件移动任务可以通过以下方式完成:

@echo off
set "BaseFolder=C:\Parent\basis"
for /D %%I in ("%BaseFolder%\*") do if exist "%%I\*.txt" (
    if not exist "%BaseFolder%_ft\%%~nxI\" md "%BaseFolder%_ft\%%~nxI" 2>nul
    if exist "%BaseFolder%_ft\%%~nxI\" move /Y "%%I\*.txt" "%BaseFolder%_ft\%%~nxI\" >nul
)
set "BaseFolder="
此批处理脚本在指定的基本文件夹中搜索非隐藏子文件夹,并将每个完全限定的文件夹名称逐个分配给循环变量I

对于基本文件夹中的每个子文件夹,将检查是否至少有一个文件扩展名为.txt的文件

如果该条件为真,则下一步将检查是否存在适当的目标文件夹,该目标文件夹是与目标基本文件夹中的基本文件夹中的当前子文件夹同名的子文件夹,并在基本文件夹名称后附加_ft。如果目标文件夹尚不存在,则会创建该文件夹

下一步检查目标文件夹现在是否真的存在,即目标文件夹创建是否真的成功。如果是这种情况,则所有扩展名为.txt的文件都将从基本文件夹中的当前子文件夹移动到基本目标文件夹中相应的目标子文件夹,并覆盖可能已存在的具有相同文件名的文本文件

要了解所使用的命令及其工作方式,请打开一个窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

回声/? 对于/? 如果/? md/? 移动/? 集/?
有关2>nul和>nul的解释,请参见Microsoft文章中关于的内容。

我认为ROBOCOPY会满足您的需求。使用ROBOCOPY/?了解有关选项的信息

如果您已准备好使用PowerShell,则可以执行以下操作。确定将删除正确的文件后,请从remove Item命令中删除-WhatIf


谢谢两种方法。ROBOCOPY工作正常,但是PowerShell脚本在basis_ft下创建了一个basis文件夹,我似乎不明白为什么。尽管我现在有了一个解决方案,但我还是很想知道为什么PowerShell脚本会这样工作。@Draco-PowerShell命令在我运行$PSVersionTable.PSVersion.ToString=>5.1.18362.628的机器上工作。您确定上次尝试时目录不在那里吗?另外,我在第二个命令中更正了目录路径。我已经尝试了多次。基址为空。PowerShell脚本创建文件夹基础。我复制了你的脚本,没有做任何更改。我运行的版本和你的相同。
for /r "C:\Parent\basis\" %%x in (*.txt) do move "%%x" "C:\Parent\basis_ft"
@echo off
set "BaseFolder=C:\Parent\basis"
for /D %%I in ("%BaseFolder%\*") do if exist "%%I\*.txt" (
    if not exist "%BaseFolder%_ft\%%~nxI\" md "%BaseFolder%_ft\%%~nxI" 2>nul
    if exist "%BaseFolder%_ft\%%~nxI\" move /Y "%%I\*.txt" "%BaseFolder%_ft\%%~nxI\" >nul
)
set "BaseFolder="
ROBOCOPY /S /MOV C:\Parent\basis C:\Parent\basis_ft *.txt
Copy-Item -Path 'C:\Parent\basis' -Destination 'C:\Parent\basis_ft' `
    -Filter '*.txt' -Recurse
Get-ChildItem -Path 'C:\Parent\basis' -Filter '*.txt' |
    ForEach-Object { Remove-Item -Path $_.FullName -WhatIf }