【问题标题】:batch file fails and cannot copy file批处理文件失败,无法复制文件
【发布时间】:2013-10-24 12:57:30
【问题描述】:

我的批处理文件目前有问题。我试图多次复制相同的图像以填充 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 可用空间。

【问题讨论】:

    标签: batch-file for-loop copy


    【解决方案1】:

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

    【讨论】:

    • 会试试这个。今天有一个不同的记忆棒给我,所以会试一试,然后在另一个记忆棒上再次测试。谢谢
    【解决方案2】:

    如果sd卡格式化为fat(fat16),一个文件夹不能超过65534个文件,但是根文件夹有512个文件的限制。

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

    但无论哪种情况,簇大小都会影响文件的分配。来自微软文档

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

    FAT32 比 FAT16 更有效地使用空间。 FAT32 使用更小的 集群(4 KB 用于高达 8 GB 的驱动器),导致 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
    

    【讨论】:

    • 我会仔细检查一下,但我格式化了驱动器,我很确定我选择了 FAT32,这是我通常会选择的。磁盘上肯定没有 65534 个文件,根文件夹中也没有 512,所以即使它是 fat16,这应该仍然有效吗?我会重新格式化,但我认为这应该是 FAT32。只是没有多大意义。它最初在 165 次后失败,直到我更改了图像的名称并缩短了它。
    • 用批处理文件更新了答案。生成的文件正好是 32kb,以确保在集群分配中不会丢失空间(除非您的集群是 64kb,根据需要进行调整)。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多