Batch file 将文件夹中的文件批量移动到新创建的文件夹

Batch file 将文件夹中的文件批量移动到新创建的文件夹,batch-file,directory,move,subdirectory,Batch File,Directory,Move,Subdirectory,我想将某些文件夹中的所有文件移动到同一文件夹中新创建的文件夹中。为便于理解,请参见下面的示例(输入显示在左侧,输出显示在右侧): 在上面的示例中,我只显示了每个文件夹中的前三个文件,但总数可能会有所不同(通常每个文件夹有1000个文件)。此外,我只显示了两个文件夹(A和B),但文件夹的总数也可能有所不同(通常约为10个文件夹)。最后,我只显示了文件夹“1”,但这类文件夹的数量也可能有所不同(通常是“1”到“10”)。因此,我正在寻找一个脚本,它可以独立于文件或文件夹的数量以及文件夹/文件的名称来

我想将某些文件夹中的所有文件移动到同一文件夹中新创建的文件夹中。为便于理解,请参见下面的示例(输入显示在左侧,输出显示在右侧):

在上面的示例中,我只显示了每个文件夹中的前三个文件,但总数可能会有所不同(通常每个文件夹有1000个文件)。此外,我只显示了两个文件夹(A和B),但文件夹的总数也可能有所不同(通常约为10个文件夹)。最后,我只显示了文件夹“1”,但这类文件夹的数量也可能有所不同(通常是“1”到“10”)。因此,我正在寻找一个脚本,它可以独立于文件或文件夹的数量以及文件夹/文件的名称来执行这些操作(我仅选择“1”、“a”和“file1.tif”作为示例)

现在的想法是,我必须在文件所在的每个文件夹(在上面的示例中称为“Named”)中手动创建空文件夹(在上面的示例中称为“A”和“B”)。然后我必须手动将所有文件移动到新创建的文件夹“Named”中。我必须为所有文件夹(大约100个)执行此操作。如果我只需要做一次,我可以手动完成整个过程,但问题是我必须多次执行此过程:-)。因此,自动化这将节省大量时间


有人知道可以这样做的脚本吗?非常感谢

稍微测试一下,这可能会在命令文件中起作用

用这些行创建一个cmd文件

for /r %%a in (*.*) do  call :singlecopy %%a
goto :eof

:singlecopy
set src=%~p1
set dst=%~p1NAMED
set file=%~n1%~x1
rem replace NAMED in src with nothing
set srctst=%src:NAMED=%
rem if src and srctst are still the same, copy 
if %srctst%==%src%  robocopy %src%  %dst% %file% /move /create
goto :eof

经过一点测试,这可能会在命令文件中起作用

用这些行创建一个cmd文件

for /r %%a in (*.*) do  call :singlecopy %%a
goto :eof

:singlecopy
set src=%~p1
set dst=%~p1NAMED
set file=%~n1%~x1
rem replace NAMED in src with nothing
set srctst=%src:NAMED=%
rem if src and srctst are still the same, copy 
if %srctst%==%src%  robocopy %src%  %dst% %file% /move /create
goto :eof

经过彻底的测试,这是非常有效的。但是,由于文件太多,您可能需要设置一个小测试环境(如示例中所示),以便在实际数据上使用它之前,首先使用它

setlocal enabledelayedexpansion
cd C:\rootfolder
for /f "tokens=*" %%a in ('dir /s /b /a:d') do (
attrib "%%a\*.*" | find "File not found"
if !errorlevel!==1 (
if not exist "%%a\Named" md "%%a\Named"
xcopy "%%a\*.*" "%%a\Named"
del "%%a\*.*" /f /q
)
)

经过彻底的测试,这是非常有效的。但是,由于文件太多,您可能需要设置一个小测试环境(如示例中所示),以便在实际数据上使用它之前,首先使用它

setlocal enabledelayedexpansion
cd C:\rootfolder
for /f "tokens=*" %%a in ('dir /s /b /a:d') do (
attrib "%%a\*.*" | find "File not found"
if !errorlevel!==1 (
if not exist "%%a\Named" md "%%a\Named"
xcopy "%%a\*.*" "%%a\Named"
del "%%a\*.*" /f /q
)
)


谢谢你的建议。我在CMD(Admin)中尝试了该代码,但没有成功。我得到了以下结果(仅显示了第一次迭代):pastebin.com/3VtnWpPE固定源目标和文件选项我尝试了新脚本,它做了一些事情。但这不是正确的事情。我最终得到了以下位置的文件:C:\1\NAMED\NAMED\NAMED\NAMED\NAMED\…\NAMED\NAMED\NAMED\NAMED\file1.tif等(总共42个命名文件夹)。另请参见此屏幕截图:C:\2\NAMED\NAMED\…这很不幸,抱歉。我已经创建了一个批处理文件,应该做得更好…感谢新脚本。我通过将脚本放在C:\1\文件夹中并运行它(通过双击它)来测试脚本。但不幸的是,它似乎只是创建了一个名为\的文件夹C:\1\而已。该文件夹中有.bat文件(但当我用记事本打开它时,.bat是空的)。无论如何,谢谢你的努力!谢谢你的建议。我在CMD(Admin)中尝试了该代码,但没有成功。我得到了以下结果(仅显示了第一次迭代):pastebin.com/3VtnWpPE固定源目标和文件选项我尝试了新脚本,它做了一些事情。但这不是正确的事情。我最终得到了以下位置的文件:C:\1\NAMED\NAMED\NAMED\NAMED\NAMED\…\NAMED\NAMED\NAMED\NAMED\file1.tif等(总共42个命名文件夹)。另请参见此屏幕截图:C:\2\NAMED\NAMED\…这很不幸,抱歉。我已经创建了一个批处理文件,应该做得更好…感谢新脚本。我通过将脚本放在C:\1\文件夹中并运行它(通过双击它)来测试脚本。但不幸的是,它似乎只是创建了一个名为\的文件夹C:\1\而已。该文件夹中有.bat文件(但当我用记事本打开它时,.bat是空的)。无论如何,谢谢你的努力!嗨,巴厘岛,谢谢你的剧本。我通过将第一行更改为“CDC:\1”来测试脚本。这很好用。但正如我在第一篇文章中提到的,“1”文件夹不是唯一的文件夹,通常有10个文件夹(从1到10)。当我将脚本中的第一行替换为“cd C:\”(假设C驱动器中除了文件夹1到10之外没有其他文件夹)时,脚本仍然可以工作,但我在“1”文件夹中得到了其他名为“Named”的空文件夹(因此C:\1\Named)。这同样适用于9个文件夹(“2”到“10”)。但这不是什么大问题。@Loek别担心,我把根文件夹路径作为一种占位符,用于一个文件夹,其中包含你所有的文件夹(就像你使用C:不包含其他文件夹的例子),因此除非你有某种根文件夹,否则很难区分你想要的和不想要的,如果你知道我的意思的话。我在测试时确实发现了这个问题,但我认为我已经解决了,我将进行更多的调试:)我刚刚测试了我的脚本,但它似乎对我来说工作得很好。我刚刚创建了一个文件夹
test
,下面有两个文件夹,
a
b
,每个文件夹都有两个文本文件,工作正常。您是否可以创建一个基本文件夹并将所有内容移动到其中,然后查看它是否有效?我的意思是,如果还有一个文件夹级别。例如,当
C:\Base\
是我的根文件夹时。然后我有
C:\Base\1\A\file1.tif
,还有
C:\Base\2\A\file1.tif
。当我用
cd C:\Base
替换脚本的第一行时,我会得到额外的空文件夹,如
C:\Base\1\Named\
C:\Base\2\Named\
。我希望这是清楚的。另外,当我查看您的代码时,它提到了一些“复制”命令。使用“移动”命令不是更有效吗?如果执行“移动”命令要困难得多,那没问题,我也可以等待文件被复制,而不是被移动:-)。啊,对了,我明白你的意思,所以如果有文件要移动到其中,你想创建一个命名文件夹吗?我最初使用的是
move
,但问题是
move
也会移动文件夹,所以