2015-04-15 3 views
-2

Я почесываю голову более недели на этом. Возникает вопрос:Пакет для случайного копирования шрифтов из одной директории в другую

У меня есть каталог с большим количеством шрифтов на моем рабочем столе, и я хочу скопировать случайные шрифты автоматически из каталога в каталог системных окон 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 

Однако этот сценарий будет копировать только один файл случайным образом из каталога «1» на C в папку «2». Поэтому необходимо установить как-то ряд файлов (50-100), которые необходимо скопировать, и решить эту проблему с перезаписью/пропуском, если шрифт существует в моем системном каталоге шрифтов Windows.

После нескольких часов экспериментов сценарий способен копировать случайные файлы из произвольных каталогов внутри определенного места в другое. Однако проблема в том, что ... очень медленно копировать 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 
+0

Это вопрос программирования? Добавьте соответствующие теги. – LittlePanda

+0

И покажите нам, что вы пробовали до сих пор. – SomethingDark

ответ

0

В вашем запросе есть несколько пунктов, которые не ясны. Сначала вы сказали, что хотите «скопировать случайные шрифты»; то вы указываете, что хотите установить значения «от» и «до» (от 50 до 100 в качестве примера), которые предполагают скопировать 50 файлов (но не случайных?). Наконец, вы хотите скопировать «30 файлов»!

Пакетный файл ниже выбирает файлы «numFiles» (т. Е. 30) случайным образом из диапазона файлов, начинающихся с «from» (т.е. 50), и заканчивается на «to» (т.е. 100) и пытается их скопировать. Если файл уже существует, он пропускается, потому что у вас есть нет указано, что делать в этом случае («делать или не делать действие») - не спецификация!).

@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 
    ) 
) 
+0

Извините, что не ясны. У меня есть каталог со шрифтами, скажем, C: \ fonts Внутри каталога есть другие каталоги, в которых средства сортируются в алфавитном порядке, например ABCD .. Z. Что я хочу делать с партией, это скопировать шрифты случайным образом из разных каталогов AZ в каталог системных шрифтов (% systemroot \ fonts). Я хочу, чтобы указать количество номеров шрифтов, которые будут копировать пакетный скрипт, например, от 20 до 30. –

+0

Просто добавьте переключатель '/ R' в' for %% f in (*. *) Do ('line ... – Aacini

Смежные вопросы