Windows 배치 파일에서 파일 크기를 KB/MB/GB 단위로 가져옵니다.

Windows 배치 파일에서 파일 크기를 KB/MB/GB 단위로 가져옵니다.

매일 파일을 백업하는 Windows(Windows 7/2008 R2) 배치 파일이 있습니다.(Oracle 덤프 내보내기 파일, 예: dump-2016-10-17.DMP)

크기에 따라 KB/MB/GB여야 하는 FILE 크기(변수에)를 추가하고 싶거나 적어도 파일 크기를 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

지원과 지침에 감사드립니다.

ls마침내 for windows를 다운로드하여 문제를 해결했으며 , 이를 사용하여 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%를 평가하여 파일이 0보다 큰 경우에만 파일을 복사하거나 0이 아닌 파일만 복사합니다.

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

%z%에 도달하는 것과 같은 방법을 사용하면 일부 절단 계산 등을 수행할 수 있지만 크기 자체를 얻는 것은 약간 고통스럽습니다.

관련 정보