批处理文件从不同的子文件夹中随机选择一个具有相同文件名的文件到一个文件夹

时间:2018-10-03 01:11:29

标签: batch-file random cmd

我需要从不同的子文件夹中随机选择大约200个特定文件到一个文件夹。详细信息如下:({tree /F /A个结果)

+--- source_folder
|   +--- Folder A
|   |      module_01.x
|   |      module_02.x
|   |      module_03.x
|   +--- Folder B
|   |      module_01.x
|   |      module_02.x
|   |      module_03.x
|   +--- Folder C
|   |      module_01.x
|   |      module_02.x
|   |      module_03.x

例如,我想随机选择3个:

module_01.x from folder B
module_02.x from folder C
module_03.x from folder C

到“目标文件夹”。

以下是我正在使用的代码,但仅传递了一些,并且似乎总是只从一个文件夹中选择许多文件,并且当尝试从另一个文件夹复制时,它不会覆盖现有文件(尝试了/ Y但没有运气)。

有什么建议吗?非常感谢你!

@echo off&setlocal enabledelayedexpansion
set "source_folder=test"
set "dest_folder=output"
set /a filecount=193

del "dest_folder\*.x"
pushd "source_folder"
for /r %%i in (*.x) do set /a files+=1& set "$!files!=%%~i"
popd
pushd "dest_folder"
:randomloop
set /a rd=%random%%%files+1
set "sco=!$%rd%!"
if not defined x goto :randomloop
set "$%rd%="
for %%i in ("%x%") do if exist "%%~nxi" echo "%%~nxi" already exist in %out%.& goto:randomloop
copy "%x%" /Y
set /a filecount-=1
if %filecount% gtr 0 goto:randomloop
popd

pause

1 个答案:

答案 0 :(得分:0)

我不理解您处理文件的方式...如果所有子文件夹都具有相同的文件(如您在“详细信息”中指定的),那么您就不需要处理所有文件,但只有一个子文件夹中的文件,然后随机选择真正的源子文件夹...

@echo off
setlocal EnableDelayedExpansion

set "source_folder=test"
set "dest_folder=output"

del "%dest_folder%\*.x"
pushd "%source_folder%"

rem Create the subFolder array
set "n=0"
for /D %%a in (*) do (
   set /A n+=1
   set "subFolder[!n!]=%%a"
)

rem Process all files in first subfolder
pushd "%subFolder[1]%"
for %%a in (*.x) do (

   rem Select a random subfolder
   set /A "ran=!random! %% n + 1"

   rem Pick the file from such random subfolder
   for /F %%r in ("!ran!") do copy "..\!subFolder[%%r]!\%%a" "..\%dest_folder%"

)

编辑已添加简单测试

我以这种方式测试了这段代码:我创建了三个文件夹,并向每个文件夹添加了四个* .x文件。然后,我在ECHO命令之前添加了copy命令,即:

for /F %%r in ("!ran!") do ECHO copy "..\!subFolder[%%r]!\%%a" "..\%dest_folder%"

最后我运行了程序。这是输出:

copy "..\folder A\module-001.x" "..\output"
copy "..\folder C\module-002.x" "..\output"
copy "..\folder B\module-003.x" "..\output"
copy "..\folder C\module-004.x" "..\output"

这表示从module-001.x复制了folder A文件,从module-002.x复制了folder C文件,从module-003.x复制了folder B文件,并且{{ {} {1}}中的1}}文件。