2013-10-24 4 views
0

Делаем скрипт, который копирует случайные папки от источника до пункта назначения, пока эта папка не является полной (зная, что папка назначения меньше, чем источник.Копирования случайных папок остановочных скоро

Всех отдельных частей работают как и предполагалось, но теперь я запускаю скрипт без включенной копии (просто эхо), поэтому в основном, если нет более крупных папок, чем оставшееся место в целевом каталоге, оно должно работать вечно.

Но он останавливается в среднем на 5 итераций, в то время как нет никакой папки, достаточно большой, чтобы заполнить каталог. Это код, который я использую

EDIT: получил это olmost работает, но теперь иногда через needed_space выходы 0

@ECHO off 
setlocal EnableDelayedExpansion 

SET n=0 
SET SOURCE_PATH=M:\Movies 
SET DEST_PATH=E:\Movies 

:: get all folders in dir 
FOR /f "usebackq tokens=*" %%a in (`DIR /b/a:d %SOURCE_PATH%`) do (
    SET /A n+=1  
    SET folder[!n!]=%%a 
) 


:loop 
    :: selecting ranodm number 
    SET /A rand=(n*%random%)/32768+1 

    :: check for space 
    for /F "tokens=3" %%S in ('dir /-c "%SOURCE_PATH%\!folder[%rand%]!\*" ^| findstr /c:"File(s)"') DO set NEEDED_SPACE=%%S 
    FOR /f "tokens=1*delims=:" %%i IN ('fsutil volume diskfree %DEST_PATH%') DO SET FREE_SPACE=%%j 

    ECHO %FREE_SPACE% - %NEEDED_SPACE% 
    IF %NEEDED_SPACE% GTR %FREE_SPACE% GOTO done 

    :: check if file does not exits 
    IF EXIST %DEST_PATH%\!folder[%rand%]! GOTO loop 

    :: copy file 
    ECHO moving %SOURCE_PATH%\!folder[%rand%]! to %DEST_PATH%\!folder[%rand%]! 

    :: again 
    GOTO loop 

:done 
    ECHO Done copying random folders, have fun! 

ответ

2

1.- Вы не приняли во внимание окружающую среду пространство утомительной. Возможно, вы не можете создать массив, который вы планируете использовать.

2.- fsutil volume diskfree ... всегда возвращают пространство в объеме, независимо от того, если вы указываете директорию

3.- if команду делать численные сравнения только тогда, когда все символы в обе стороны от оператора являются числовыми. Ваш() отключает его, поэтому (10) меньше (3)

+0

Собираюсь посмотреть в эти вещи – Kiwi

+0

Fixed что, но теперь только некоторые файлы вывод 0, как там размер, и есть файл в них. (обновленный код в исходном потоке) – Kiwi

+0

Установите команду echo, чтобы показать, какая исходная папка выбрана, и проверьте, что папка содержит в ней файлы. ФАЙЛЫ. Если он содержит папки, но не содержит файлов, пространство в каталоге будет 0, так как ваша команда dir не рекурсивна –

0

Хорошо, это работает до сих пор. ожидая диска, чтобы получить полный, если это работает, то это должно быть достаточным (не 100% совершенный контроль, но достаточно близко)

код:

@ECHO off 
setlocal EnableDelayedExpansion 

SET n=0 
SET SOURCE_PATH=M:\src 
SET DEST_PATH=E:\dest 

:: get all folders in dir 
FOR /f "usebackq tokens=*" %%a in (`DIR /b/a:d %SOURCE_PATH%`) do (
    SET /A n+=1  
    SET folder[!n!]=%%a 
) 

:loop 
    :: selecting ranodm number 
    SET /A rand=(n*%random%)/32768+1 

    :: check for space 
    for /F "tokens=3" %%a in ('dir /-c "%SOURCE_PATH%\!folder[%rand%]!" ^| findstr /c:"File(s)"') do set bytesfree=%%a 
    set bytesfree=%bytesfree:,=% 
    set /a NEEDED_SPACE=%bytesfree:~0,-3% 

    for /f "tokens=3" %%a in ('dir %DEST_PATH%\') do set bytesfree=%%a 
    set bytesfree=%bytesfree:,=% 
    set /a FREE_SPACE=%bytesfree:~0,-3% 


    ECHO %FREE_SPACE% - %NEEDED_SPACE% 
    IF %NEEDED_SPACE% GTR %FREE_SPACE% GOTO done 

    :: check if file does not exits 
    IF EXIST %DEST_PATH%\!folder[%rand%]! GOTO loop 

    :: copy file 
    set src="%SOURCE_PATH%\!folder[%rand%]!\*" 
    set dest= "%DEST_PATH%\!folder[%rand%]!\*" 
    ECHO moving %src% to %dest% 
    xcopy /s /e /i %src% %dest% 

    :: again 
    GOTO loop 

:done 
    ECHO Done copying random folders, have fun! 
Смежные вопросы