
매일 파일을 백업하는 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%에 도달하는 것과 같은 방법을 사용하면 일부 절단 계산 등을 수행할 수 있지만 크기 자체를 얻는 것은 약간 고통스럽습니다.