我需要从不同的子文件夹中随机选择大约 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
到"dest_folder"。
以下是我正在使用的代码,但只穿梭了几个,它似乎总是从一个文件夹中选择许多文件,当它尝试从另一个文件夹复制时,它不会覆盖现有的文件(尝试了/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
我不明白你处理文件的方式...如果所有子文件夹都有相同的文件(如您在"详细信息"中指定的那样(,那么您不需要处理所有文件,而只需要处理一个子文件夹中的文件,然后随机选择真正的源子文件夹......
@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 文件。然后,我在copy
命令之前添加了一个ECHO
命令,即:
for /F %%r in ("!ran!") do ECHO copy "..!subFolder[%%r]!%%a" "..%dest_folder%"
最后我运行了该程序。这是输出:
copy "..folder Amodule-001.x" "..output"
copy "..folder Cmodule-002.x" "..output"
copy "..folder Bmodule-003.x" "..output"
copy "..folder Cmodule-004.x" "..output"
这意味着module-001.x
文件是从folder A
复制的,module-002.x
文件是从folder C
复制的,module-003.x
文件是从folder B
复制的,module-004.x
文件是从folder C
复制的。