在 Windows 批处理文件中获取文件大小(以 KB/MB/GB 为单位)

在 Windows 批处理文件中获取文件大小(以 KB/MB/GB 为单位)

我有一个 Windows(Windows 7/2008 R2)批处理文件,它每天备份文件。(Oracle 转储导出文件,例如 dump-2016-10-17.DMP)

我想添加文件大小(在变量中),根据大小应以 KB/MB/GB 为单位,或者至少应以 MB 为单位获取文件大小。代码:

@echo off
SET DONE=0
SET Bytes=%~z1
SET KB=%Bytes:~0,-3%
SET MB=%Bytes:~0,-6%
SET GB=%Bytes:~0,-9%
SET TB=%Bytes:~0,-12%
rem echo %~f1

IF "%KB%" EQU "" SET DONE=B
IF %DONE% EQU B echo Size is... %Bytes% Bytes
IF %DONE% EQU B GOTO END

IF "%MB%" EQU "" SET DONE=K
IF %DONE% EQU K SET /a KB=(%BYTES%/1024)+1
IF %DONE% EQU K echo Size is... %KB% KB
IF %DONE% EQU K GOTO END

IF "%GB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=(%BYTES%/1048576)+1
IF %DONE% EQU M echo Size is... %MB% MB
IF %DONE% EQU M GOTO END

IF "%TB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=%KB%/1049
IF %DONE% EQU M echo Size is... %MB% MB (approx)
IF %DONE% EQU M GOTO END

SET DONE=G
IF %DONE% EQU G SET /a GB=%MB%/1074
IF %DONE% EQU G echo Size is... %GB% GB (approx)
IF %DONE% EQU G GOTO END
:END

答案1

作为替代方案,您可以使用robocopy命令的输出来检索所需的信息

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "file=d:\somewhere\file.ext"

    for %%z in ("%file%") do for /f "tokens=1,2" %%a in ('
        robocopy "%%~dpz." "%%~dpz." "%%~nxz" /l /nocopy /is /njh /njs /ndl /nc
    ') do if "%%~dz"=="%%~db" (
        echo "%%~z" : [%%a]
    ) else (
        echo "%%~z" : [%%a%%b] 
    )

robocopy将仅用于列出(/l)正在复制的文件的信息,从输出中删除任何不需要的信息(其余开关),并使用命令for /f标记输出行并仅读取文件大小

对于文件夹,可以使用同样的想法,但不是从文件列表中读取数据,我们可以使用递归“复制”并从工作摘要中检索数据

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=%~f1" & if not defined folder set "folder=%cd%"

    set "size=" & for %%z in ("%folder%") do for /f "skip=2 tokens=2,3 delims=: " %%a in ('
        robocopy "%%~fz\." "%%~fz\." /l /nocopy /s /is /njh /nfl /ndl /r:0 /w:0 /xjd /xjf /np
        ^| find ":"
    ') do if not defined size (
        (for /f "delims=0123456789." %%c in ("%%b") do (break)) && (
            set "size=%%a%%b"
        ) || (
            set "size=%%a"
        )
    )

    echo "%folder%" : [%size%]

开关更改为仅检索作业摘要,并进行过滤以仅读取包含信息的行Bytes

編輯2016/10/26 - 更改了 robocopy 开关以应对权限问题,将Byte:检索更改为:行过滤器加上跳过子句,以防万一出现没有Bytes:字符串的区域设置,更改了存储单元检测。

答案2

一种解决方案是从其他批次中调用该批次,并将备份文件作为参数。您将以文本形式获取大小,并将其保存在变量中。

要“内联”执行此操作,您可以在循环中使用它,如下所示:

for %f in (%backupfile%) do set BYTES=%~zf

从可读性的角度来看,第一个解决方案会更好。

答案3

感谢您的支持和指导。

我最终设法通过下载适用于 Windows 的版本解决了这个问题ls,并且通过它ls -lh filename我获得了我需要的信息以及其他信息。

例子:

D:\zaib>D:\tools\ls.exe -lh setup.exe

-rwxr-x--a  1 Administrators   590M Oct  6  2015 setup.exe

答案4

你需要两样东西。

filesize.bat 

@echo off
echo %~z1

然后你实际上试图确定这里报告的值

因此,在这个例子中,我评估 %z% 以仅当文件大于零时才复制文件/仅复制非零文件

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

像获取 %z% 这样的操作可以让你做一些截断数学运算或者其他操作,但是获取大小本身却有点麻烦。

相关内容