2009-07-29 35 views
51

Tôi muốn có một tập tin thực thi để kiểm tra xem filesize là một tập tin nào.Làm cách nào để kiểm tra kích thước tệp trong tập lệnh batch của Windows?

Nếu nó lớn hơn %somany% kbytes,, nó sẽ chuyển hướng với GOTO đến một nơi khác.

Ví dụ:

[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 

Trả lời

83

Nếu tên tập tin được sử dụng như một tham số để các tập tin thực thi, tất cả bạn cần là %~z1 (1 có nghĩa là tham số đầu tiên)

Nếu tên tệp không phải là thông số, bạn có thể làm điều gì đó như:

@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

bạn có thể giải thích làm thế nào tùy chọn "usebackq" giúp? Nó dường như không có gì để làm với kích thước tập tin, nhưng nếu tôi loại bỏ nó, nó ngừng hoạt động – JoelFan

+8

@ JoelFan: Nếu không có usebackq, 'quote có nghĩa là lệnh và không phải chuỗi (Chạy FOR /? Cho các chi tiết) Để giải quyết tốt hơn với không gian trong tên tệp) là sử dụng: FOR/F "tokens = *" %% A IN ("% file%") DO ... – Anders

+0

Xin chào @Anders Bạn có thể cho tôi biết cách tôi có thể làm tương tự không khi tôi có nhiều tệp trong một chuỗi. Giống như tôi muốn thiết lập nếu tập tin của tôi là ít hơn 2kb sau đó di chuyển nó vào một thư mục khác ?.Kết quả của tôi sẽ kiểm tra từng tệp trong đường dẫn và xác thực. –

-4

Chỉ cần một ý tưởng:

Bạn có thể nhận filesize bằng cách chạy lệnh "dir":

>dir thing 

Sau đó, một lần nữa nó sẽ trả về rất nhiều điều.

Có thể bạn có thể lấy từ đó nếu bạn tìm kiếm.

Nhưng tôi không chắc chắn.

4

Như thường lệ, VBScript có sẵn để bạn có thể sử dụng .....

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

Save as filesize.vbs và nhập vào dòng lệnh:

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

Sử dụng một vòng lặp for (trong lô) để có được kết quả trả về.

8

Nếu %file% là thông số đầu vào, bạn có thể sử dụng %~zN, trong đó N là số tham số.

Ví dụ: một test.bat chứa

@echo %~z1 

Sẽ hiển thị kích thước của tham số đầu tiên, vì vậy nếu bạn sử dụng "test myFile.txt" nó sẽ hiển thị kích thước của tập tin tương ứng.

10

%~z1 mở rộng thành kích thước của đối số đầu tiên cho tệp lô. Xem

C:\> call /? 

C:\> if /? 

đơn giản ví dụ:

@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 giải pháp của bạn không hoạt động trên windows server 2008 .. –

1

Chỉ cần nhìn thấy câu hỏi cũ này để xem liệu Windows có cài đặt gì đó không. Tôi đã kết thúc với một lớp lót 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 
1

Đây là giải pháp của tôi để đánh giá kích thước tệp mà không sử dụng VB/perl/etc.và gắn bó với các lệnh trình bao cửa sổ gốc:

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

Không phải là giải pháp rõ ràng nhất, nhưng nó hoàn thành công việc.

4

Một ví dụ khác

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

Tôi thích sử dụng một chức năng hệ điều hành DOS. Cảm thấy sạch hơn với tôi.

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

GOTO :EOF 

:FileSize 
SET %~2=%~z1 

GOTO :EOF 
+0

không có hàm và ': eof' trong DOS. Đó là những tính năng của Windows cmd.exe. [Chúng hoàn toàn khác] (https://superuser.com/q/451432/241386) –

2

Tạo một dòng GetFileSize.bat batch file chứa

GetFileSize=%~z1 

sau đó gọi nó

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. 

Bạn thậm chí có thể tạo ra tập tin thử nghiệm của bạn một cách nhanh chóng để loại bỏ các tập tin cần thiết pesky , lưu ý phần trăm gấp đôi trong câu lệnh echo:

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

Giải pháp thứ hai này là antispaghetti. Thật tốt. Tuy nhiên, nhiều đĩa ghi hơn. Kiểm tra số lượng sử dụng.

-1

Lưu ý quan trọng là giới hạn hàng loạt INT32: 'Số không hợp lệ. Các con số được giới hạn ở độ chính xác 32 bit. '

Hãy thử những điều khoản sau đây:

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

Bất kỳ số lớn hơn giá trị tối đa int32 sẽ phá vỡ SCRIPT! Xem dưới dạng tệp được đo bằng byte, các tập lệnh sẽ hỗ trợ kích thước tối đa khoảng 255.9999997615814 MB!

+0

Điều này là không chính xác. Tôi đã tạo một tệp 5 GB và có thể đọc kích thước tệp của nó bằng cách sử dụng% ~ z1 và báo cáo 5056590344. –

+1

Đó là vì nó vẫn là một chuỗi, không được chuyển đổi thành một số. Hãy thử làm một so sánh, hoặc số học với Set/A, và bất cứ điều gì để lớn hơn 2 GB sẽ thất bại. – Bilbo

9

Tôi thích @Anders trả lời vì lời giải thích về sốt bí mật% ~ z1. Tuy nhiên, như đã chỉ ra, chỉ hoạt động khi tên tệp được chuyển thành tham số đầu tiên vào tệp lô.

@ Người làm việc xung quanh việc này bằng cách sử dụng FOR, trong đó, là một bản sửa lỗi 1 lớp lót tuyệt vời cho vấn đề, nhưng hơi khó đọc hơn.

Thay vào đó, chúng tôi có thể quay lại câu trả lời đơn giản hơn với% ~ z1 bằng cách sử dụng CALL. Nếu bạn có một tên tập tin lưu trữ trong một biến môi trường nó sẽ trở thành % 1 nếu bạn sử dụng nó như là một tham số để một thói quen trong tập tin batch của bạn:

@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

Sau một vài "thử và thử nghiệm" lặp đi lặp lại tôi đã tìm thấy một cách (vẫn không trình bày ở đây) để có được kích thước của tập tin trong biến chu kỳ (không phải là một tham số dòng lệnh):

for %%i in (*.txt) do (
    echo %%~z%i 
) 
Các vấn đề liên quan