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
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
)
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
%~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
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
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.
Un autre exemple
FOR %I in (file1.txt) do @ECHO %~zI
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.
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.
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
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.
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
)
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!