2009-07-29 11 views
51

Chcę mieć plik wsadowy, który sprawdza, co jest w pliku filesize.Jak mogę sprawdzić rozmiar pliku w skrypcie wsadowym Windows?

Jeśli jest większy niż %somany% kbytes,, powinien przekierować z GOTO do innego miejsca.

Przykład:

[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 

Odpowiedz

83

Jeśli nazwa pliku jest używana jako parametr do pliku wsadowego, co potrzebne jest %~z1 (1 oznacza pierwszy parametr)

Jeśli nazwa pliku nie jest parametrem, można zrobić coś takiego:

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

można wyjaśnić w jaki sposób pomaga opcja "usebackq"? Wydaje się, że nie ma to nic wspólnego z rozmiarem pliku, ale jeśli go usunę, przestanie działać – JoelFan

+8

@JoelFan: Bez usebackq, polecenie "quote oznacza polecenie, a nie ciąg (Run FOR /? For details) Inna alternatywa (Aby lepiej radzić sobie ze spacjami w nazwach plików, należy użyć: FOR/F "tokeny = *" %% A IN ("% file%") DO ... – Anders

+0

Witam @Anders Czy możesz dać mi znać, w jaki sposób mogę zrobić to samo kiedy mam wiele plików w sekwencji. Tak jak chcę ustawić, czy mój plik ma mniej niż 2kb, a następnie przenieść go do folderu diff ?.Mój wynik powinien przetestować każdy plik na ścieżce i zatwierdzić. –

-4

tylko pomysł:

można uzyskać rozmiar pliku przez polecenie działa "dir":

>dir thing 

Potem znowu powraca tak wiele rzeczy.

Może uda się ją pobrać, jeśli jej szukasz.

Ale nie jestem pewien.

4

Jak zwykle, VBScript jest dostępna do użycia .....

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

Zapisz filesize.vbs i wprowadzić w wierszu poleceń:

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

Skorzystaj z for pętla (w batch), aby uzyskać wynik powrotu.

8

Jeśli twój %file% jest parametrem wejściowym, możesz użyć %~zN, gdzie N jest numerem parametru.

E.g. test.bat zawierający

@echo %~z1 

wyświetla rozmiar pierwszego parametru, więc jeśli używasz „test myFile.txt” to wyświetli rozmiaru odpowiedniego pliku.

10

%~z1 rozwija się do rozmiaru pierwszego argumentu pliku wsadowego. Zobacz

C:\> call /? 

i

C:\> if /? 

prosty przykład:

@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 
+0

Sinan Ünür rozwiązanie nie działa w systemie Windows Server 2008 .. –

1

Właśnie zobaczyłem to stare pytanie, aby sprawdzić, czy system Windows ma coś wbudowanego. To, czego nie wiedziałem, nie dotyczy mnie. Skończyło się na tym, że jeden liniowiec Perla:

@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

To było moje rozwiązanie do oceny rozmiarów plików bez użycia VB/perl/etc.i wystaje z okna rodzime poleceń powłoki:

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

Nie najczystszym rozwiązanie, ale dostaje zadanie.

4

Innym przykładem

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

wolę używać funkcji DOS. Czuję się dla mnie czystszy.

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

GOTO :EOF 

:FileSize 
SET %~2=%~z1 

GOTO :EOF 
+0

nie ma funkcji i ': eof' w systemie DOS. To są funkcje Windows cmd.exe. [Są zupełnie inne] (https://superuser.com/q/451432/241386) –

2

Utwórz plik wsadowy jednego wiersza zawierającego GetFileSize.bat

GetFileSize=%~z1 

następnie nazwać

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. 

Można nawet utworzyć plik testowy na bieżąco, aby wyeliminować brzydkie wymaganego pliku , zanotuj podwójny procent w wyciągu z echa:

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

To ostatnie rozwiązanie to antispaghetti. Tak miło. Jednak więcej zapisuje na dysku. Sprawdź liczbę użytków.

-1

Należy zwrócić uwagę na limit INT32 dla partii: "Nieprawidłowy numer. Liczby są ograniczone do 32 bitów dokładności. "

Spróbuj wykonać następujące oświadczenia:

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

Dowolna liczba większa niż wartość maksymalna Int32 złamie skrypt! Ponieważ rozmiar pliku jest mierzony w bajtach, skrypty obsługują maksymalny rozmiar pliku około 255.9999997615814 MB!

+0

To jest nieprawidłowe. Stworzyłem plik 5 GB i byłem w stanie odczytać jego rozmiar za pomocą% ~ z1 i zgłosił 5056590344. –

+1

To dlatego, że wciąż jest ciągiem, nie konwertowanym na liczbę. Spróbuj wykonać porównanie lub arytmetyczne za pomocą Set/A, a wszystko, co jest większe niż 2 GB, zawiedzie. – Bilbo

9

Lubię @Anders odpowiedzieć, ponieważ wyjaśnienie sekretnego sosu% ~ z1. Jednak, jak wskazano, działa to tylko wtedy, gdy nazwa pliku zostanie przekazana jako pierwszy parametr do pliku wsadowego.

@Anderowie rozwiązali ten problem, używając FOR, która jest świetną poprawką 1-linerową na , ale jest nieco trudniejsza do odczytania.

Zamiast tego możemy wrócić do prostszej odpowiedzi z% ~ z1 przy użyciu CALL. Jeśli masz nazwę pliku zapisanego w zmiennej środowiskowej stanie się % 1 jeśli używasz go jako parametr do funkcji w pliku wsadowym:

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

Po kilku „próbować i test” iteracji I” już znalazł sposób (jeszcze nie prezentujemy tutaj), aby uzyskać rozmiar pliku w zmiennej cyklu (a nie parametrów wiersza poleceń):

for %%i in (*.txt) do (
    echo %%~z%i 
) 
Powiązane problemy