在 Windows 批次檔中取得檔案大小(以 KB/MB/GB 為單位)

在 Windows 批次檔中取得檔案大小(以 KB/MB/GB 為單位)

我有一個 Windows (Windows 7/2008 R2) 批次文件,它每天備份文件。

我想添加檔案大小(在變數中),根據大小應以 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% 這樣的東西可以讓你做一些截斷數學或其他東西,但獲取大小本身有點痛苦。

相關內容