¿Cómo puedo verificar el tamaño de un archivo en un script por lotes de Windows?

Quiero tener un archivo por lotes que compruebe qué es el filesize del filesize de un archivo.

Si es mayor que %somany% kbytes, debe redirigir con GOTO a otro lugar.

Ejemplo:

 [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 el nombre del archivo se utiliza como un parámetro para el archivo por lotes, todo lo que necesita es %~z1 (1 significa el primer parámetro)

Si el nombre del archivo no es un parámetro, puede hacer algo como:

 @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 expande al tamaño del primer argumento en el archivo por lotes. Ver

 C:\> call /? 

y

 C:\> if /? 

Ejemplo 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 

Me gusta la respuesta de @Anders porque la explicación de la salsa secreta% ~ z1. Sin embargo, como se señaló, eso solo funciona cuando se pasa el nombre del archivo como el primer parámetro al archivo por lotes.

@Anders solucionó esto utilizando FOR , que es una gran solución para el problema, pero es algo más difícil de leer.

En cambio, podemos volver a una respuesta más simple con% ~ z1 usando CALL . Si tiene un nombre de archivo almacenado en una variable de entorno, se convertirá en% 1 si lo usa como parámetro para una rutina en su archivo por lotes:

 @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 

Prefiero usar una función de DOS. Se siente más limpio para mí.

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

Si su %file% es un parámetro de entrada, puede usar %~zN , donde N es el número del parámetro.

Por ejemplo, un test.bat contiene

 @echo %~z1 

Mostrará el tamaño del primer parámetro, por lo que si usa ” test myFile.txt “, mostrará el tamaño del archivo correspondiente.

Como de costumbre, VBScript está disponible para su uso …..

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

Guarde como filesize.vbs e ingrese en la línea de comandos:

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

Use un bucle for (en lote) para obtener el resultado de la devolución.

Otro ejemplo

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

Cree un archivo por lotes de una línea GetFileSize.bat que contenga

 GetFileSize=%~z1 

entonces llámalo

 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. 

Incluso puede crear su archivo de prueba sobre la marcha para eliminar el molesto archivo requerido, tenga en cuenta el doble por ciento en la statement de eco:

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

Esta última solución es antispaghetti. Tan agradable. Sin embargo, más grabaciones de disco. Verificar el recuento de uso.

Acabo de ver esta vieja pregunta para ver si Windows tenía algo incorporado. La cosa es algo que no sabía, pero no es aplicable para mí. Terminé con un trazador de líneas 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 

Esta fue mi solución para evaluar tamaños de archivo sin usar VB / perl / etc. y seguir con los comandos nativos de Windows shell:

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

No es la solución más limpia, pero hace el trabajo bien.

Después de algunas iteraciones de “prueba y prueba” he encontrado una forma (todavía no presente aquí) de obtener el tamaño del archivo en la variable de ciclo (no un parámetro de línea de comando):

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

Importante observar es el límite INT32 de Batch: ‘Número inválido. Los números están limitados a 32 bits de precisión.

Pruebe las siguientes declaraciones:

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

¡Cualquier número mayor que el valor máximo de INT32 ROMPERÁ EL SCRIPT! Viendo que el tamaño del archivo se mide en bytes, los scripts soportarán un tamaño de archivo máximo de aproximadamente 255.9999997615814 MB.

Solo una idea:

Puede obtener el tamaño del archivo ejecutando el comando “dir”:

 >dir thing 

Entonces, de nuevo, devuelve tantas cosas.

Tal vez puedas obtenerlo de allí si lo buscas.

Pero no estoy seguro.