0

我正在制作一个脚本,将随机文件夹从源复制到目标,直到该文件夹​​已满(知道目标文件夹比源文件夹小。

所有单独的部分都按预期工作,但我现在正在运行不包含副本的脚本(只是一个回显),所以基本上如果没有任何文件夹大于目标目录中的剩余空间,它应该运行曾经。

但它平均停止 5 次迭代,而没有任何大到足以填满目录的文件夹。这是我正在使用的代码

编辑:让它最有效,但现在有时需要的空间输出 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!
4

2 回答 2

2

1.-您没有考虑到环境空间的消耗。也许您无法创建您想要的数组。

2.-fsutil volume diskfree ...始终返回 VOLUME 中的空格,无论您是否指示目录

3.-if仅当运算符两边的所有字符都是数字时,命令才进行数字比较。您的 () 禁用它,因此 (10) 小于 (3)

于 2013-10-24T10:29:31.030 回答
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!
于 2013-10-24T12:28:32.303 回答