어떻게 확인할 수 있습니 파일의 크기에서 Windows 배치는 스크립트를 사용해야 할까요?

StackOverflow https://stackoverflow.com/questions/1199645

  •  20-09-2019
  •  | 
  •  

문제

내가 원하는 배치 파일을 확인하는 것 filesize 은 파일입니다.

은 경우 보다 더 큰 %somany% kbytes, 그것은 리디렉션으로토를 다른 곳이다.

예제:

[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
도움이 되었습니까?

해결책

파일 이름이 배치 파일의 매개 변수로 사용되는 경우 필요한 것은 %~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
)

다른 팁

%~ z1 비밀 소스에 대한 설명이 있기 때문에 @anders 대답을 좋아합니다. 그러나 지적한 바와 같이, 파일 이름이 배치 파일의 첫 번째 매개 변수로 전달 될 때만 작동합니다.

@anders는 사용 하여이 문제를 해결했습니다 FOR, 이것은 문제에 대한 훌륭한 1- 라이너 수정이지만 읽기가 다소 어렵습니다.

대신, 우리는 사용하여 %~ z1로 더 간단한 답변으로 돌아갈 수 있습니다. CALL. 환경 변수에 파일 이름이 저장된 경우 배치 파일의 루틴의 매개 변수로 사용하면 %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

32 비트 제한에 대한 J. Bouvrie의 우려에 대해 궁금했습니다. 그가 사용하는 문제에 대해 이야기하고있는 것 같습니다. 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

%~z1 첫 번째 인수의 크기를 배치 파일로 확장합니다. 보다

C:\> call /?

그리고

C:\> if /?

Simple example:

@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

내가 사용하는 것을 선호하는 DOS 기능입니다.청다.

SET SIZELIMIT=1000
CALL :FileSize %1 FileSize
IF %FileSize% GTR %SIZELIMIT% Echo Large file

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

당신의 경우 %file% 입력 매개 변수이며 사용할 수 있습니다 %~zN, 어디 N 매개 변수의 수입니다.

예, a test.bat 포함

@echo %~z1

첫 번째 매개 변수의 크기가 표시되므로 사용하는 경우 "test myFile.txt"해당 파일의 크기가 표시됩니다.

평소와 같이 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

a for 반환 결과를 얻으려면 루프 (배치).

또 다른 예

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

하나의 라인 배치 파일 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.

테스트 파일을 즉석에서 만들기 위해 Pesky 필수 파일을 제거하고 Echo 문의 이중 %를 기록 할 수도 있습니다.

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

이 후자의 솔루션은 안티 스파 구티입니다. 너무 좋아. 그러나 더 많은 디스크가 씁니다. 사용 카운트를 점검하십시오.

이 오래된 질문은 Windows에 무언가가 내장되어 있는지 확인하려는이 오래된 질문을 보았습니다. ~ z는 내가 알지 못했지만 적용 할 수없는 것입니다. 나는 Perl One-Liner로 끝났다 :

@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

이것은 VB/Perl/etc를 사용하지 않고 파일 크기를 평가하기위한 내 솔루션이었습니다. 기본 Windows 쉘 명령을 고수합니다.

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  
    )
)  

가장 깨끗한 솔루션은 아니지만 작업이 완료됩니다.

주목해야 할 중요한 것은 Batch의 int32 한계입니다. '유효하지 않은 숫자. 숫자는 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!)

Max Int32 값보다 큰 숫자는 스크립트를 중단합니다! 파일 크기가 바이트로 측정되면 스크립트는 약 255.999997615814 MB의 최대 파일 크기를 지원합니다!

몇 가지 "시도 및 테스트"반복 후에는 Cycle Line 매개 변수가 아님)에서 파일 크기를 얻는 방법 (여기에 여전히 존재하지 않음)을 찾았습니다.

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

그냥 아이디어 :

"dir"명령을 실행하여 파일 크기를 얻을 수 있습니다.

>dir thing

그런 다음 다시 너무 많은 것들이 돌아옵니다.

어쩌면 당신이 그것을 찾으면 거기에서 얻을 수 있습니다.

그러나 나는 확실하지 않다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top