如何随机 select 一定数量的文件(相同的文件名但 4/5 不同的扩展名)并将它们移动到另一个文件夹?

How to select randomly a certain number of files (same filename but 4/5 different extensions) and move them to another folder?

我有一个包含数百个文件的目录,这些文件具有描述性的不同名称,但扩展名始终相同(示例):

LetItBe(TheBeatles).mid
LetItBe(TheBeatles).jpg
LetItBe(TheBeatles).ran
LetItBe(TheBeatles).zip
LetItBe(TheBeatles)Scan.mid

扫描总是在文件名的末尾并且总是同一个词)*

下一组:

HeyJude(TheBeatles).mid
HeyJude(TheBeatles).jpg
HeyJude(TheBeatles).ran
HeyJude(TheBeatles).zip
HeyJude(TheBeatles)Scan.mid

我要批次

随机select一些文件(比如10个)和 将具有相同文件名的所有关联文件(即两个 MID、jpg、运行、zip)复制到不同的目录。

我不希望批处理停止,例如,如果一组文件缺少 jpg 文件或 mid 文件,而只是将现有文件复制到新文件夹并继续下一个 运行domly selected 组。

我找到了一个批处理代码,可以在 运行domly 中移动一个 MIDI 文件,但我不确定如何插入指定所有具有相同文件名但不同扩展名的文件的代码也应该感动...

@echo off
set folder=C:\Test1
set destfolder=C:\Test2

for /f "delims=" %%C in ('dir /b /a-d "%folder%\*.mid" ^| find /c /v ""') do set /A num=%random% %% %%C
for /f "delims=" %%F in ('dir /b /a-d "%folder%\*.mid" ^| more +%num%') do set name=%%F & goto next

:next

echo (By the way, I chose %name% )
move "%folder%\%name%" "%destfolder%\%name%"

用户 Mofi 提供了此帮助..

The command to copy all files starting with same string is copy "%FileName%." "C:\Destination Folder" with environment variable FileName being defined by the code selecting randomly one of the file groups, for example, with set "FileName=HeyJude(TheBeatles)". More safe would be using two COPY command lines: copy "%FileName%.*" "C:\Destination Folder" and copy "%FileName%Scan.mid" "C:\Destination Folder" 2>nul in case of there are the file sets HeyJude(TheBeatles) and HeyJude(TheBeatles) Live and file set HeyJude(TheBeatles) should be copied to destination folder.

但我不知道如何将它插入到现有代码中。我尝试将最后一行编辑为

move "%folder%\%name%*.*

但随后根本没有文件被移动,系统找不到任何匹配的文件名。

感谢帮助!

对于随机 selecting 文件,可以使用 %random% 并迭代 10 次。这将随机 select 10 个文件名,然后复制文件名 `.* 意味着将复制任何具有给定名称、任何扩展名的文件。

@echo off & setlocal enabledelayedexpansion
set "folder=C:\Test1"
set "destfolder=C:\Test2"
set num=0
pushd "%folder%"
for %%a in (*.*) do (
   set /a num+=1
   set "name[!num!]=%%~na"
)
for /l %%i in (1,1,10) do (
   call :randm
 )
popd
goto :eof
:randm
set /a "rnd=(num*%random%)/32768+1"
copy "!name[%rnd%]!*" "%destfolder%"