批量将字体从一个目录随机复制到另一个目录

时间:2015-04-15 09:12:30

标签: windows file batch-file optimization copy

我对此感到头疼了一个多星期。这是一个问题:

我的桌面上有一个包含大量字体的目录,我想自动将随机字体从目录复制到我的系统windows字体目录中。另外,我想在批处理文件中设置一些值“from”和“to”,复制多少字体,例如从50到100。此外,我的桌面上的某些字体已存在于windows系统字体目录中,因此需要自动覆盖或跳过这些字体。 一个例子:

@echo off
setlocal EnableDelayedExpansion
cd C:\1
set n=0
for %%f in (*.*) do (
   set /A n+=1
   set "file[!n!]=%%f"
)
set /A "rand=(n*%random%)/32768+1"
copy "!file[%rand%]!" C:\2

但是,此脚本只会将一个文件从C上的目录“1”随机复制到目录“2”。因此,如果我的Windows字体系统目录中存在某种字体,则需要以某种方式设置需要复制的一系列文件(50-100)并解决此覆盖/跳过问题。

经过几个小时的实验,该脚本能够将随机文件从某个特定位置内的随机目录复制到另一个目录。但问题是......复制说30个文件的速度很慢。也许有人可以帮助我至少优化它? ;)

@echo off
setlocal EnableExtensions EnableDelayedExpansion

:loop

pushd "C:\1"

:: Enumerate Files
set "xCount=0"
for /r %%A in (*.*) do if exist "%%~A" set /a "xCount+=1"

:: Select a Random File.
set /a "xIndex=%Random% %% %xCount%"

:: Find an Copy that File
set "xTally=0"
for /r %%A in (*.*) do if exist "%%~A" (
    if "!xTally!" EQU "%xIndex%" (
        xcopy "%%~fA" "C:\2" /Y
        goto End
    )
    set /a "xTally+=1"
)

:End
popd

set /a executecounter=%executecounter%+1
if "%executecounter%"=="30" goto done
goto loop
:done

endlocal

1 个答案:

答案 0 :(得分:0)

您的请求中有几点不清楚。首先你说你要“复制随机字体”;那么你指定你想要设置一些“从”和“到”值(从50到100作为例子),这意味着复制50个文件(但不是随机的?)。最后,你要复制“30个文件”!

下面的批处理文件从“从”(即50)开始并以“到”(即100)结束的文件范围中随机选择“numFiles”文件(即30),并尝试复制它们。如果文件已经存在,则会跳过该文件,因为您已经指定在这种情况下要执行的操作(“执行或不执行操作”不是规范!)

@echo off
setlocal EnableDelayedExpansion

rem Set working values (you may get these values from Batch file parameters)
set numFiles=30
set from=50
set to=100

rem Load the files into an array
cd C:\1
set n=0
for %%f in (*.*) do (
   set /A n+=1
   set "file[!n!]=%%f"
)

rem Process "numFiles" files
for /L %%i in (1,1,%numFiles%) do (
   rem Create a random index between "from" and "to"
   set /A "rand=((to-from)*!random!)/32768+from"
   rem Pass the new value of "rand" into a FOR parameter
   for %%r in (!rand!) do (
      rem Copy this random file, if not exists
      if not exist "C:\2\!file[%%r]!" copy "!file[%rand%]!" C:\2
   )
)