【问题标题】:How can I check the size of a file in a Windows batch script?如何在 Windows 批处理脚本中检查文件的大小?
【发布时间】:2010-11-15 00:56:37
【问题描述】:

我想要一个批处理文件来检查filesize 是什么文件。

如果它大于%somany% kbytes,,它应该使用 GOTO 重定向到其他地方。

例子:

[check for filesize]
IF %file% [filesize thing Bigger than] GOTO No
echo Great! Your filesize is smaller than %somany% kbytes.
pause
exit
:no
echo Um... You have a big filesize.
pause
exit

【问题讨论】:

    标签: batch-file filesize


    【解决方案1】:

    如果文件名用作批处理文件的参数,则只需%~z1(1表示第一个参数)

    如果文件名不是参数,你可以这样做:

    @echo off
    setlocal
    set file="test.cmd"
    set maxbytesize=1000
    
    FOR /F "usebackq" %%A IN ('%file%') DO set size=%%~zA
    
    if %size% LSS %maxbytesize% (
        echo.File is ^< %maxbytesize% bytes
    ) ELSE (
        echo.File is ^>= %maxbytesize% bytes
    )
    

    【讨论】:

    • 你能解释一下“usebackq”选项有什么帮助吗?它似乎与文件大小无关,但如果我删除它,它就会停止工作
    • @JoelFan:没有 usebackq,' 引号表示命令而不是字符串(运行 FOR /? 了解详细信息)另一种选择(为了更好地处理文件名中的空格)是使用: FOR /F " tokens=*" %%A IN ("%file%") DO ...
    • 嗨@Anders 你能告诉我当我有多个文件时如何做同样的事情。就像我想设置我的文件是否小于 2kb 然后将其移动到 diff 文件夹?我的结果应该测试路径中的每个文件并进行验证。
    • 旁注:您应该在之前检查文件是否存在。否则文件大小将只是一个空字符串......我花了一段时间才注意到。
    • 没关系...对于我来说,将它写入现有文件的变量甚至都行不通...
    【解决方案2】:

    我喜欢@Anders 的回答,因为 %~z1 秘诀的解释。 但是,正如所指出的,这仅在文件名作为 批处理文件的第一个参数。

    @Anders 使用 FOR 解决了这个问题,这是一个很好的 1-liner 修复 问题,但是,它有点难以阅读。

    相反,我们可以使用CALL 使用 %~z1 回到更简单的答案。 如果您将文件名存储在环境变量中,它将变为 %1 如果您将其用作批处理文件中例程的参数:

    @echo off
    setlocal
    set file=test.cmd
    set maxbytesize=1000
    
    call :setsize %file%
    
    if %size% lss %maxbytesize% (
        echo File is less than %maxbytesize% bytes
    ) else (
        echo File is greater than or equal %maxbytesize% bytes
    )
    goto :eof
    
    :setsize
    set size=%~z1
    goto :eof
    

    我一直对 J. Bouvrie 对 32 位限制的担忧感到好奇。看来他是在谈论使用LSS 而不是在文件大小逻辑本身上的问题。为了解决 J. Bouvrie 的问题,我重写了解决方案以使用填充字符串比较:

    @echo on
    setlocal
    set file=test.cmd
    set maxbytesize=1000
    
    call :setsize %file%
    
    set checksize=00000000000000000000%size%
    set checkmaxbytesize=00000000000000000000%maxbytesize%
    if "%checksize:~-20%" lss "%checkmaxbytesize:~-20%" (
        echo File is less than %maxbytesize% bytes
    ) else (
        echo File is greater than or equal %maxbytesize% bytes
    )
    goto :eof
    
    :setsize
    set size=%~z1
    goto :eof
    

    【讨论】:

      【解决方案3】:

      %~z1 扩展为批处理文件的第一个参数的大小。见

      C:\> call /?
      

      C:\> if /?
      

      简单示例:

      @ECHO OFF
      SET SIZELIMIT=1000
      SET FILESIZE=%~z1
      
      IF %FILESIZE% GTR %SIZELIMIT% Goto No
      
      ECHO Great! Your filesize is smaller than %SIZELIMIT% kbytes.
      PAUSE
      GOTO :EOF
      
      :No
      ECHO Um ... You have a big filesize.
      PAUSE
      GOTO :EOF
      

      【讨论】:

        【解决方案4】:

        我更喜欢使用 DOS 功能。我觉得更干净。

        SET SIZELIMIT=1000
        CALL :FileSize %1 FileSize
        IF %FileSize% GTR %SIZELIMIT% Echo Large file
        
        GOTO :EOF
        
        :FileSize
        SET %~2=%~z1
        
        GOTO :EOF
        

        【讨论】:

        • DOS 中没有函数和:eof。这些是 Windows cmd.exe 的功能。 They're completely different
        • 除了关于不是 DOS 的细节。这是最干净的解决方案。使用 call :label 获取可以使用的编号参数。
        【解决方案5】:

        如果您的%file%是输入参数,您可以使用%~zN,其中N是参数的编号。

        例如test.bat 包含

        @echo %~z1
        

        会显示第一个参数的大小,所以如果使用“test myFile.txt”会显示对应文件的大小。

        【讨论】:

          【解决方案6】:

          另一个例子

            FOR %I in (file1.txt) do @ECHO %~zI
          

          【讨论】:

            【解决方案7】:

            像往常一样,VBScript 可供您使用.....

            Set objFS = CreateObject("Scripting.FileSystemObject")
            Set wshArgs = WScript.Arguments
            strFile = wshArgs(0)
            WScript.Echo objFS.GetFile(strFile).Size & " bytes"
            

            另存为filesize.vbs并在命令行输入:

            C:\test>cscript /nologo filesize.vbs file.txt
            79 bytes
            

            使用for循环(批量)获取返回结果。

            【讨论】:

              【解决方案8】:

              这是我在不使用 VB/perl/etc 的情况下评估文件大小的解决方案。并坚持使用原生 Windows shell 命令:

              FOR /F "tokens=4 delims= " %%i in ('dir /-C %temp% ^| find /i "filename.txt"') do (  
                  IF %%i GTR 1000000 (  
                      echo filename.txt filesize is greater than 1000000  
                  ) ELSE (  
                      echo filename.txt filesize is less than 1000000  
                  )
              )  
              

              不是最干净的解决方案,但它可以完成工作。

              【讨论】:

                【解决方案9】:

                创建一个包含GetFileSize.bat的一行批处理文件

                GetFileSize=%~z1
                

                然后调用它

                call GetFileSize  myfile.txt
                if (%GetFileSize) == ()     goto No_File
                if (%GetFileSize) == (0)    goto No_Data
                if (%GetFileSize) GTR 1000  goto Too_Much_Data
                rem Etc.
                

                您甚至可以即时创建测试文件以消除讨厌的所需文件,请注意 echo 语句中的双百分号:

                echo set GetFileSize=%%~z1 > %temp%\GetFileSize.bat
                call %temp%\GetFileSize  myfile.txt
                if (%GetFileSize) GTR 1000  goto Too_Much_Data
                rem etc
                

                后一种解决方案是反意大利面。太赞了。但是,更多的磁盘写入。检查使用次数。

                【讨论】:

                  【解决方案10】:

                  经过几次“尝试和测试”迭代后,我找到了一种方法(此处仍然不存在)在循环变量(不是命令行参数)中获取文件大小:

                  for %%i in (*.txt) do (
                      echo %%~z%i
                  )
                  

                  【讨论】:

                    【解决方案11】:

                    刚刚看到这个老问题,想看看 Windows 是否内置了一些东西。 ~z 东西是我不知道的,但不适用于我。我最终得到了一个 Perl 单行:

                    @echo off
                    
                    set yourfile=output.txt
                    set maxsize=10000
                    
                    perl -e "-s $ENV{yourfile} > $ENV{maxsize} ? exit 1 : exit 0"
                    rem if %errorlevel%. equ 1. goto abort
                    if errorlevel 1 goto abort
                    
                    echo OK!
                    exit /b 0
                    
                    :abort
                    echo Bad!
                    exit /b 1
                    

                    【讨论】:

                      【解决方案12】:

                      需要注意的是 Batch 的 INT32 限制:'Invalid number。数字被限制为 32 位精度。'

                      试试下面的语句:

                      IF 2147483647 GTR 2147483646 echo A is greater than B (will be TRUE)
                      IF 2147483648 GTR 2147483647 echo A is greater than B (will be FALSE!)
                      

                      任何大于最大 INT32 值的数字都会破坏脚本!由于文件大小以字节为单位,脚本将支持大约 255.9999997615814 MB 的最大文件大小!

                      【讨论】:

                      • 这是不正确的。我创建了一个 5 GB 的文件,并且能够使用 %~z1 读取它的文件大小,它报告了 5056590344。
                      • 那是因为它仍然是一个字符串,没有转换为数字。尝试使用 Set /A 进行比较或算术运算,任何大于 2 GB 的内容都会失败。
                      • 将 NTFS 转换为 FAT32 时,确定哪些文件超过 4GB 限制非常重要。虽然 Windows 资源管理器允许搜索“大小:> 4GB”,但我更喜欢结果的文本输出。实际上,Windows 10 仍然具有 INT32 CLI 和 BATCH 限制 2^31。使用逻辑:“显示我的 F:驱动器上需要寻址的所有文件:”-@for /f "tokens=*" %F in ('dir /s /b /a:-d f:\') do @IF %~zF geq 4294967296 ECHO %F &gt;&gt; FindFilesTooLargeForFAT32.txt。输出是超过 2GB(不是 256MB)的文件。 2^31 = 32bit = 2,147,483,648 = 2GB(技术上 GiB gibibyte 1024^3 * 2)。
                      • 解决方法是:资源管理器过滤视图(即:大小:>4GB)、Ctrl+A、Shift r-click、复制为路径、在 Notepad++ 中粘贴、TextFX 工具升序排序(因为复制由于路径不反映 UI 中显示的顺序)。
                      • 我们可以通过填充字符串比较来解决 INT32 问题。
                      【解决方案13】:

                      你需要两件事。

                      filesize.bat 
                      
                      @echo off
                      echo %~z1
                      

                      然后是您实际尝试确定的大小。

                      仅当文件大于零时复制文件/仅复制非零文件

                      for /f %i in ('filesize filesize.bat') do set z=%i
                      if %z% gtr 0 ( copy filesize.bat noodles.bat )
                      

                      我找到了这个线程,几乎正是我需要的,我尝试了很多不同的东西 - 这有点令人沮丧,因为 robocopy 看起来有 /min:1 但因为我想要重命名传输中的文件,这让我不得不使用@#$!!批处理脚本。

                      【讨论】:

                        【解决方案14】:

                        只是一个想法:

                        您可以通过运行命令“dir”来获取文件大小:

                        >dir thing
                        

                        然后它又返回了很多东西。

                        如果你寻找它,也许你可以从那里得到它。

                        但我不确定。

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-07-16
                          • 2014-12-26
                          相关资源
                          最近更新 更多