Frage

Ich möchte eine Batch-Datei haben, die überprüft, was die filesize einer Datei ist.

Wenn es größer als %somany% kbytes, ist es mit GOTO woanders umleiten soll.

Beispiel:

[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
War es hilfreich?

Lösung

Wenn der Dateiname als Parameter der Batch-Datei verwendet wird, alles, was Sie brauchen, ist %~z1 (1 Mittel erster Parameter)

Wenn der Dateiname nicht ein Parameter ist, können Sie so etwas wie:

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

Andere Tipps

Ich mag @Anders Antwort, weil die Erklärung des% ~ z1 geheime Sauce. Wie jedoch darauf hingewiesen, dass funktioniert nur, wenn der Dateiname als das übergeben wird erste Parameter auf die Batchdatei.

@Anders gearbeitet, um diesen durch FOR mit, was, ist ein großer 1-liner fix das Problem, aber es ist etwas schwieriger zu lesen.

Stattdessen können wir mit% ~ z1 auf eine einfachere Antwort zurück durch CALL verwenden. Wenn Sie einen Dateinamen in einer Umgebungsvariablen gespeichert sind, wird es werden 1%, wenn Sie es als Parameter an eine Routine in Batch-Datei:

@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

Ich habe in Bezug auf neugierig über J. Bouvrie Besorgnis 32-Bit-Grenzen. Es scheint, dass er über ein Thema spricht mit der Verwendung von LSS nicht auf der Dateigröße Logik selbst. Um mit J. Bouvrie Sorge zu beschäftigen, ich habe die Lösung neu geschrieben über einen gepolsterten String-Vergleich zu verwenden:

@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 erweitert auf die Größe des ersten Arguments auf die Batchdatei. Siehe

C:\> call /?

und

C:\> if /?

Einfaches Beispiel:

@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

Ich ziehe eine DOS-Funktion zu verwenden. Man fühlt sich sauberer zu mir.

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

Wenn Ihr %file% ein Eingabeparameter ist, können Sie verwenden %~zN, wo N die Nummer des Parameters ist.

z. ein test.bat mit

@echo %~z1

Wird die Größe des ersten Parameters angezeigt werden, wenn Sie also „test myFile.txt“ verwenden wird es die Größe der entsprechenden Datei angezeigt werden soll.

Wie üblich, VBScript ist für Sie verwenden .....

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

Speichern unter filesize.vbs und geben Sie auf der Kommandozeile:

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

Verwenden Sie eine for Schleife (im Batch) die Rückkehr Ergebnis zu erhalten.

Ein weiteres Beispiel

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

Erstellen Sie eine einzeilige Batchdatei GetFileSize.bat mit

GetFileSize=%~z1

es dann rufen

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.

Sie können sogar Ihre Testdatei on the fly erstellen, die nervtötende gewünschte Datei zu beseitigen, beachten Sie das Doppel Prozent in der echo-Anweisung:

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

Diese letztere Lösung ist antispaghetti. So nett. Doch mehr Festplatte schreibt. Überprüfen Sie Verwendungsanzahl.

Gerade gesehen, diese alte Frage suchen, um zu sehen, ob Windows in etwas gebaut hatte. Die ~ z Sache etwas, das ich nichts wusste, aber für mich nicht anwendbar. Ich landete mit einem Perl-Einzeiler:

@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

Dies war meine Lösung Dateigrößen für die Bewertung ohne VB / perl / etc. und Kleben mit nativen Windows-Shell-Befehle:

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

Nicht die sauberste Lösung, aber es wird die Arbeit erledigt.

Wichtig zu beachten ist das INT32 Limit von Batch: ‚Ungültige Nummer. Die Zahlen sind beschränkt auf 32-Bit Genauigkeit. "

Versuchen Sie die folgenden Aussagen:

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

Eine beliebige Anzahl größer als die max INT32 Wert wird das Skript BREAK! Sehen als Dateigröße in Bytes gemessen wird, werden die Skripte eine maximale Dateigröße von etwa 255,9999997615814 MB unterstützen!

Nach ein paar „Try and test“ Iterationen Ich habe einen Weg gefunden, (noch nicht vorhanden hier) Größe der Datei in Zyklus variabel zu bekommen (kein Befehlszeilenparameter):

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

Nur eine Idee:

Sie können die Dateigröße erhalten, indem Befehl "dir" ausgeführt wird:

>dir thing

Sie es dann wieder zurück, so viele Dinge.

Vielleicht können Sie es von dort, wenn Sie danach suchen.

Aber ich bin nicht sicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top