Пакетный файл случайным образом выбирает файлы с одинаковыми именами из разных подпапок в одну папку - PullRequest
0 голосов
/ 03 октября 2018

Мне нужно случайно выбрать около 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

1 Ответ

0 голосов
/ 03 октября 2018

Я не понимаю, как вы обрабатываете файлы ... Если во всех подпапках есть одинаковые файлы (как вы указали в "подробностях"), тогда вам не нужно обрабатывать все файлы , но только файлы из одной подпапки , а затем случайным образом выберите подпапку реального источника ...

@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 и module-004.xфайл из folder C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...