Comment puis-je vérifier la taille d’un fichier dans un script de lot Windows?

Je veux avoir un fichier de commandes qui vérifie la filesize du fichier.

S’il est plus grand que %somany% kbytes, il devrait redirect avec GOTO ailleurs.

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 

Si le nom de fichier est utilisé comme paramètre dans le fichier de commandes, tout ce dont vous avez besoin est %~z1 (1 signifie le 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 ) 

%~z1 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 

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

@Anders a contourné ce problème en utilisant FOR , ce qui est une excellente solution au 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 vous avez un nom de fichier stocké dans une variable d’environnement, il deviendra% 1 si vous l’utilisez comme paramètre d’une routine dans 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 %maxbytesize% bytes ) goto :eof :setsize set size=%~z1 goto :eof 

Je préfère utiliser une fonction DOS. Se sent plus propre pour moi.

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

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, un test.bat contenant

 @echo %~z1 

Affiche la taille du premier paramètre, donc si vous utilisez ” test myFile.txt “, la taille du fichier correspondant sera affichée.

Comme d’habitude, VBScript est à votre disposition …..

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

Enregistrez 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 de retour.

Un autre exemple

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

Créez un fichier de commandes par ligne GetFileSize.bat contenant

 GetFileSize=%~z1 

puis appelle

 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 requirejs, notez le double pour cent dans la déclaration 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 disques écrivent. Vérifiez le compte d’utilisation.

Je viens de voir cette vieille question pour voir si Windows avait quelque chose de intégré. Je me suis retrouvé 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 

C’était ma solution pour évaluer la taille des fichiers sans utiliser VB / perl / etc. et coller avec les commandes natives de 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 ) ) 

Pas la solution la plus propre, mais elle fait le travail.

Après quelques itérations “try and test”, j’ai trouvé un moyen (toujours pas présent ici) d’obtenir la taille du fichier en variable de cycle (pas un paramètre de ligne de commande):

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

Il est important de noter la limite INT32 du lot: «Numéro invalide. Les nombres sont limités à 32 bits de précision.

Essayez les instructions 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 max INT32 va briser le script! Comme la taille des fichiers est mesurée en octets, les scripts prendront en charge une taille de fichier maximale d’environ 255.9999997615814 Mo!

Juste une idée:

Vous pouvez obtenir la taille du fichier en exécutant la commande “dir”:

 >dir thing 

Là encore, il retourne tellement de choses.

Peut-être que vous pouvez l’obtenir de là si vous le cherchez.

Mais je ne suis pas sûr.