web-dev-qa-db-fra.com

Comment vérifier la taille d'un fichier dans un script batch Windows?

Je veux avoir un fichier de commandes qui vérifie ce que le filesize est d'un fichier.

S'il est plus grand que %somany% kbytes, il devrait rediriger avec GOTO vers un autre endroit.

Exemple:

[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
58
Deniz Zoeteman

Si le nom de fichier est utilisé en tant que paramètre du fichier de commandes, tout ce dont vous avez besoin est %~z1 _ (1 signifie premier paramètre)

Si le nom du fichier n'est pas un paramètre, vous pouvez faire quelque chose comme:

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

J'aime @Anders répondre parce que l'explication de la sauce secrète% ~ z1. Cependant, comme indiqué, cela ne fonctionne que lorsque le nom du fichier est passé en tant que premier paramètre au fichier de commandes.

@Anders a résolu ce problème en utilisant FOR, ce qui est une excellente solution à un problème pour le problème, mais il est un peu plus difficile à lire.

Au lieu de cela, nous pouvons revenir à une réponse plus simple avec% ~ z1 en utilisant CALL. Si un nom de fichier est stocké dans une variable d’environnement, il deviendra% 1 si vous l’utilisez en tant que paramètre d’une routine de votre fichier de commandes:

@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

Je suis curieux de savoir si J. Bouvrie est préoccupé par les limitations de 32 bits. Il semble qu'il parle d'un problème lié à l'utilisation de LSS et non de la logique de la taille du fichier elle-même. Pour répondre à la préoccupation de J. Bouvrie, j'ai réécrit la solution pour utiliser une comparaison de chaîne complétée:

@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
13
Stephen Quan

%~z1 se développe à la taille du premier argument du fichier de commandes. Voir

C:\> call /?

et

C:\> if /?

Exemple simple:

@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
11
Sinan Ünür

Je préfère utiliser une fonction DOS. Me sens plus propre.

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF
9
user3708417

Si votre %file% est un paramètre d’entrée, vous pouvez utiliser %~zN, où N est le numéro du paramètre.

Par exemple. une test.bat contenant

@echo %~z1

Affiche la taille du premier paramètre, donc si vous utilisez "test myFile.txt "il affichera la taille du fichier correspondant.

8
HerdplattenToni

Un autre exemple

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

Comme d'habitude, VBScript est disponible pour vous .....

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

Enregistrer sous filesize.vbs et entrez sur la ligne de commande:

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

Utilisez une boucle for (en batch) pour obtenir le résultat.

4
ghostdog74

Créez un fichier de commandes d'une ligne GetFileSize.bat contenant

GetFileSize=%~z1

alors appelez-le

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.

Vous pouvez même créer votre fichier de test à la volée pour éliminer le fichier requis embêtant, notez le double pour cent dans l'instruction echo:

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

Cette dernière solution est antispaghetti. Vraiment gentil. Cependant, plus de disque écrit. Vérifiez le nombre d'utilisations.

2
jim birch

Je viens de voir cette vieille question qui cherchait à savoir si Windows possédait quelque chose d'intégré. Le problème de ~ z est quelque chose que je ne connaissais pas, mais qui ne me concerne pas. J'ai fini avec un one-liner Perl:

@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
1
Bill Ruppert

C'était ma solution pour évaluer la taille des fichiers sans utiliser VB/Perl/etc. et s'en tenir aux commandes natives du shell 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  
    )
)  

Ce n'est pas la solution la plus propre, mais le travail est fait.

1
bennett

Après quelques itérations "essayer et tester", j'ai trouvé un moyen (toujours pas présent ici) d'obtenir la taille du fichier dans la variable de cycle (pas un paramètre de ligne de commande):

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

Il est important de noter que la limite INT32 du lot: "Nombre non valide. Les nombres sont limités à 32 bits de précision.

Essayez les affirmations suivantes:

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

Tout nombre supérieur à la valeur maximale INT32 brisera le script! Vu que la taille du fichier est mesurée en octets, les scripts supporteront une taille de fichier maximale d'environ 255,9999997615814 Mo!

0
J. Bouvrie