Windows 随机选择15个文件并将其复制到输出文件夹

Windows 随机选择15个文件并将其复制到输出文件夹,windows,batch-file,cmd,Windows,Batch File,Cmd,必须在XP/Vista/7上工作。可以使用批处理、VBS或任何其他任何具有上述O/SE的人可以运行的程序(PE除外) 需要选择15个随机文件,以及类似命名的文件夹(位于不同位置),同时将它们复制到自己的文件夹中 我搜索了谷歌和robvanderwoude.com等网站,找到了一些相近的例子,但我太没经验了,无法根据自己的需要调整这些例子,而不必大惊小怪。如果有人能给我指出正确的方向(最有效/最容易使用的方法),或者举一些例子,可能有一个简短的解释,我也可以从中学习,我将不胜感激 布局说明: 30

必须在XP/Vista/7上工作。可以使用批处理、VBS或任何其他任何具有上述O/SE的人可以运行的程序(PE除外)

需要选择15个随机文件,以及类似命名的文件夹(位于不同位置),同时将它们复制到自己的文件夹中

我搜索了谷歌和robvanderwoude.com等网站,找到了一些相近的例子,但我太没经验了,无法根据自己的需要调整这些例子,而不必大惊小怪。如果有人能给我指出正确的方向(最有效/最容易使用的方法),或者举一些例子,可能有一个简短的解释,我也可以从中学习,我将不胜感激

布局说明:

30 files:
%~dp0\mod\store\XMLs -> %~dp0\mod\0.1.2\map\data  
map01_aaa.xml  
map02_bbb.xml  
map03_ccc.xml  
...  
map60_zzz.xml

30 folders:
%~dp0\mod\store\models -> %~dp0\mod\0.1.2\sky\stuff  
01_aaa_map  
02_bbb_map  
03_ccc_map  
...  
60_zzz_map
下面的代码就是我试图采用的代码,但它只按顺序选择了15个文件/文件夹。尝试在SrcMax的等式中使用%random%环境变量,但这只是选择了随机数量的文件,并且总是从第一个文件开始。
(旧代码)


我相信这应该行得通

@echo off
setlocal enabledelayedexpansion
set XMLs_src=.\mod\store\XMLs
set XMLs_dest=.\mod\0.1.2\map\data
set maps_src=.\mod\store\models
set maps_dest=.\mod\0.1.2\sky\stuff

rmdir /q /s "%XMLs_dest%" 2>NUL
rmdir /q /s "%maps_dest%" 2>NUL
mkdir "%XMLs_dest%"
mkdir "%maps_dest%"

for /L %%X in (1,1,15) do (
    call :rnd rn
    call :xml !rn!
    call :map !rn!
)
copy "%XMLs_dest%\*.*" "%XMLs_src%" >NUL
echo d | xcopy /q /f /e /y "%maps_dest%\*" "%maps_src%" >NUL
echo Done.
goto :EOF

:rnd
set c=0
for /d %%I in (%maps_src%\*) do set /a c+=1 >NUL
set /a %1=%RANDOM% * %c% / 32768 + 1 >NUL
goto :EOF

:xml
set c=0
for /f %%I in ('dir /b /o:n "%XMLs_src%"') do (
    set /a c+=1 >NUL
    if !c!==%1 (
        echo %XMLs_src%\%%I -^> %XMLs_dest%\%%I
        move "%XMLs_src%\%%I" "%XMLs_dest%" >NUL
        goto :EOF
    )
)
goto :EOF

:map
set c=0
for /f %%I in ('dir /b /o:n "%maps_src%"') do (
    set /a c+=1 >NUL
    if !c!==%1 (
        echo %maps_src%\%%I -^> %maps_dest%\%%I
        echo d | xcopy /q /f /e /y "%maps_src%\%%I" "%maps_dest%\%%I" >NUL
        rmdir /q /s "%maps_src%\%%I"
        goto :EOF
    )
)
goto :EOF

它基本上是移动以防止复制,然后从目标复制回源以恢复移动的内容。

无法使其工作。已尝试3小时,但无法移动/复制文件,我做错了什么?输出:|改用%c%==%%1重试,输出:|改用%%dp0重试。对于路径变量,存储中现在缺少Output:XMLs文件夹,它正在复制所有30个文件/文件夹,而不是15个。我会把它弄得乱七八糟,看看我能不能让它工作。有时它也不工作,必须运行几次才能开始复制/移动东西。我想我无法解决这个问题。我让它移动并复制回XML文件(不是文件夹),但它不是随机的,只有前15个XML被移动/复制。模型文件夹中的文件夹均已移动/复制,而不是15个。知道发生了什么吗?我所做的更改是删除\*并将\*.*添加到:xml标签的%XMLs_src%中。我分解并创建了一些测试文件,与您在原始帖子中描述的类似。我修复了一些问题,现在这对我来说很有效,拉取了15个随机映射和匹配的XML。
@echo off
setlocal enabledelayedexpansion
set XMLs_src=.\mod\store\XMLs
set XMLs_dest=.\mod\0.1.2\map\data
set maps_src=.\mod\store\models
set maps_dest=.\mod\0.1.2\sky\stuff

rmdir /q /s "%XMLs_dest%" 2>NUL
rmdir /q /s "%maps_dest%" 2>NUL
mkdir "%XMLs_dest%"
mkdir "%maps_dest%"

for /L %%X in (1,1,15) do (
    call :rnd rn
    call :xml !rn!
    call :map !rn!
)
copy "%XMLs_dest%\*.*" "%XMLs_src%" >NUL
echo d | xcopy /q /f /e /y "%maps_dest%\*" "%maps_src%" >NUL
echo Done.
goto :EOF

:rnd
set c=0
for /d %%I in (%maps_src%\*) do set /a c+=1 >NUL
set /a %1=%RANDOM% * %c% / 32768 + 1 >NUL
goto :EOF

:xml
set c=0
for /f %%I in ('dir /b /o:n "%XMLs_src%"') do (
    set /a c+=1 >NUL
    if !c!==%1 (
        echo %XMLs_src%\%%I -^> %XMLs_dest%\%%I
        move "%XMLs_src%\%%I" "%XMLs_dest%" >NUL
        goto :EOF
    )
)
goto :EOF

:map
set c=0
for /f %%I in ('dir /b /o:n "%maps_src%"') do (
    set /a c+=1 >NUL
    if !c!==%1 (
        echo %maps_src%\%%I -^> %maps_dest%\%%I
        echo d | xcopy /q /f /e /y "%maps_src%\%%I" "%maps_dest%\%%I" >NUL
        rmdir /q /s "%maps_src%\%%I"
        goto :EOF
    )
)
goto :EOF