Hoe kan ik de grootte van een bestand in een Windows-batchscript controleren?

Ik wil een batchbestand hebben dat controleert wat de filesizeis van een bestand.

Als het groter is dan %somany% kbytes,moet het met GOTO omleiden naar ergens anders.

Voorbeeld:

[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

Antwoord 1, autoriteit 100%

Als de bestandsnaam wordt gebruikt als parameter voor het batchbestand, hebt u alleen %~z1nodig (1 betekent eerste parameter)

Als de bestandsnaam geen parameter is, kun je zoiets doen als:

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

Antwoord 2, autoriteit 22%

Ik vind het antwoord van @Anders leuk vanwege de uitleg van de %~z1 geheime saus.
Zoals opgemerkt, werkt dat echter alleen als de bestandsnaam wordt doorgegeven als de
eerste parameter naar het batchbestand.

@Anders heeft dit omzeild door FORte gebruiken, wat een geweldige 1-liner oplossing is om
het probleem, maar het is wat moeilijker te lezen.

In plaats daarvan kunnen we teruggaan naar een eenvoudiger antwoord met %~z1 door CALLte gebruiken.
Als u een bestandsnaam hebt opgeslagen in een omgevingsvariabele, wordt deze:
%1 als u het als parameter voor een routine in uw batchbestand gebruikt:

@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

Ik ben benieuwd naar J. Bouvrie’s bezorgdheid over 32-bits beperkingen. Het lijkt erop dat hij het heeft over een probleem met het gebruik van LSSen niet over de logica van de bestandsgrootte zelf. Om de bezorgdheid van J. Bouvrie weg te nemen, heb ik de oplossing herschreven om een ​​gewatteerde stringvergelijking te gebruiken:

@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

Antwoord 3, autoriteit 10%

%~z1breidt zich uit tot de grootte van het eerste argument van het batchbestand. Zie

C:\> call /?

en

C:\> if /?

Eenvoudig voorbeeld:

@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

Antwoord 4, autoriteit 10%

Ik gebruik liever een DOS-functie. Voelt voor mij schoner.

SET SIZELIMIT=1000
CALL :FileSize %1 FileSize
IF %FileSize% GTR %SIZELIMIT% Echo Large file
GOTO :EOF
:FileSize
SET %~2=%~z1
GOTO :EOF

Antwoord 5, autoriteit 8%

Als uw %file%een invoerparameter is, kunt u %~zNgebruiken, waarbij Nhet nummer van de parameter is.

Bijvoorbeeld een test.batmet

@echo %~z1

Geeft de grootte van de eerste parameter weer, dus als u “test myFile.txt” gebruikt, wordt de grootte van het bijbehorende bestand weergegeven.


Antwoord 6, autoriteit 5%

Nog een voorbeeld

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

Antwoord 7, autoriteit 4%

Zoals gewoonlijk is VBScript voor u beschikbaar om te gebruiken…..

Set objFS = CreateObject("Scripting.FileSystemObject")
Set wshArgs = WScript.Arguments
strFile = wshArgs(0)
WScript.Echo objFS.GetFile(strFile).Size & " bytes"

Opslaan als filesize.vbsen voer de opdrachtregel in:

C:\test>cscript /nologo filesize.vbs file.txt
79 bytes

Gebruik een forlus (in batch) om het retourresultaat te krijgen.


Antwoord 8, Autoriteit 2%

Dit was mijn oplossing voor het evalueren van bestandsgroottes zonder VB / PERL / ETC te gebruiken. en plakken met native Windows Shell-opdrachten:

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

Niet de schoonste oplossing, maar het krijgt de taak gedaan.


Antwoord 9, Autoriteit 2%

Maak een batchbestand van één regel-batch-bestand.bat met

GetFileSize=%~z1

bel het

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.

U kunt zelfs uw testbestand op de vlucht maken om het PESKY-vereiste bestand te elimineren, rekening houden met het dubbele percentage in de ECHO-verklaring:

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

Deze laatste oplossing is Antispaghetti. Zo leuk. Schrijft echter meer schijf. Controleer het aantal gebruik.


Antwoord 10, Autoriteit 2%

Na een paar “PROBEER EN TEST” ITERATIES Ik heb een manier gevonden (nog steeds niet aanwezig) om de grootte van het bestand in cyclusvariabele te krijgen (geen parameter van de opdrachtregel):

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

Antwoord 11

zag gewoon deze oude vraag op zoek om te zien of Windows iets ingebouwd had. Het ~ Z ding is iets waar ik niet over wist, maar niet van toepassing voor mij. Ik eindigde met een 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

Antwoord 12

Belangrijk om op te merken is de int32-limiet van batch: ‘Ongeldig nummer. Nummers zijn beperkt tot 32-bits van precisie. ‘

Probeer de volgende uitspraken:

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

Elk nummer dat groter is dan de maximale int32-waarde zal het script breken! Als u als bestandsgrootte wordt gemeten in bytes, ondersteunt de scripts een maximale bestandsgrootte van ongeveer 255.9999997615814 MB!


Antwoord 13

heb je twee dingen nodig.

filesize.bat 
@echo off
echo %~z1

En dan probeert u daadwerkelijk te passen.

Kopieer alleen een bestand als het groter is dan nul / kopieer alleen een niet-nulbestand

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

Ik vond deze thread en het was bijna wat ik nodig had, ik probeerde een aantal verschillende dingen – dit was mild frustrerend omdat Robocopy leek te hebben / min: 1 maar kreeg allemaal gunned vanwege Wilde het bestand in Transit hernoemen, waardoor ik @ # $ moest gebruiken !! batch-script.


Antwoord 14

Gewoon een idee:

U kunt de bestandsgrootte krijgen door opdracht “dir” te gebruiken:

>dir thing

Nogmaals, het geeft zoveel dingen terug.

Misschien kun je het vanaf daar halen als je er naar op zoek bent.

Maar ik weet het niet zeker.

Other episodes