어떻게 확인할 수 있습니 파일의 크기에서 Windows 배치는 스크립트를 사용해야 할까요?
-
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
그런 다음 다시 너무 많은 것들이 돌아옵니다.
어쩌면 당신이 그것을 찾으면 거기에서 얻을 수 있습니다.
그러나 나는 확실하지 않다.