批处理文件失败,无法复制文件

时间:2013-10-24 12:57:31

标签: batch-file for-loop copy

我目前遇到批处理文件问题。我试图多次复制相同的图像以填充SD卡。这样做的目的是写入文件以填充SD卡,以便我可以查看是否可以恢复在复制之前已删除的项目。自动执行此过程将使我能够更快地完成项目,并减少复制文件的时间。

@echo off
setlocal enableDelayedExpansion

REM counts from 0 to count, so 8 = 9 copies
set count=16000

set filename_1=image

set extension=.jpeg

set start_1=

set source=%filename_1%%start_1%%extension%

for /L %%i in (0, 1, %count%) do (
  set /a "number_1=start_1+%%i"
  set destination=%filename_1%!number_1!%extension%
  echo !destination!
  copy %source% !destination!
)

pause

这是我当前的批处理文件,但由于某种原因,它在246份副本后失败。任何人都有任何解释为什么它只会复制那么多次?完成运行后仍有1.5GB的可用空间。

3 个答案:

答案 0 :(得分:0)

首先尝试将所有内容复制到硬盘驱动器上的文件夹,然后移动该文件夹。我在硬盘上运行了这个文件,它运行得很好

答案 1 :(得分:0)

如果sd卡被格式化为fat(fat16),你不能在文件夹中放置超过65534个文件,但根文件夹的限制为512个文件。

如果格式化为fat32,则目录没有文件限制。

但在任何一种情况下,群集大小都会影响文件的分配。来自microsoft文档

  

FAT16可以浪费大型驱动器中的文件存储空间作为大小   集群增加。分配用于存储文件的空间基于   群集分配粒度的大小,而不是文件大小。一个   存储在32 KB群集中的10 KB文件会浪费22 KB的磁盘空间。

     

FAT32比FAT16更有效地使用空间。 FAT32使用较小   集群(驱动器最大为8 GB,4 KB),占10%到15%   相对于大型FAT16驱动器,可以更有效地使用磁盘空间。 FAT32   还减少了计算机运行所需的资源。

检查文件系统

编辑

测试/调整此批处理文件。它将在磁盘中生成一个32kb的文件,然后复制它直到复制命令失败。

@echo off

    setlocal enableextensions enabledelayedexpansion

    set fillFileName=fillDisk%random%_
    set fillFileExtension=.dat
    set fillFile=%~dp0%fillFileName%%fillFileExtension%

    rem create a file to replicate to fill disk 
    call :createFile "%fillFile%"

    rem Let's fill the disk

    set fileCount=0
:loop
    rem do copy file
    copy "%fillFile%" "%~dp0%fillFileName%%fileCount%%fillFileExtension%" /y >nul 2>nul
    if errorlevel 1 (
        rem file copy failed.
        goto endProcess
    )

    rem copy ok - increment counter
    set /a fileCount=fileCount+1

    rem print indicator on console (show it is working)
    echo.|set /p=.

    rem go to do a new file copy
    goto loop

:endProcess

    rem show final information
    echo.
    echo [ %fileCount% ] files copied
    echo.

    rem disk filled - optional - delete all generated files
    del "%~dp0%fillFileName%*%fillFileExtension%"

    rem clean and exit
    endLocal
    exit /b

:createFile
    rem define a 2k buffer ( 32 * 2^6 )
    set fill=012345678901234567890123456789..
    for /L %%i in (1 1 6) do set fill=!fill!!fill!
    rem correction for crlf at end when output
    set fill=%fill:~0,-2%
    rem output buffer to indicated file (32 kb = 2kb * 16)
    (
        for /L %%i in (1 1 16) do echo %fill%
    ) > "%~1"
    set fill=
    goto :EOF

答案 2 :(得分:0)

不要将它们复制到根目录。在名为1的根目录中创建一个目录,并将所有文件复制到该目录中。如果您使用具有相同大小或分配单位倍数的文件,它仍会覆盖所有扇区。

请注意,填写驱动器存储扇区不一定会清除所有旧文件名的文件表。