كيف يمكنني التحقق من حجم الملف في برنامج نصي Windows Batch؟

StackOverflow https://stackoverflow.com/questions/1199645

  •  20-09-2019
  •  | 
  •  

سؤال

أريد أن يكون لديك ملف دفعي يتحقق ما filesize هو من ملف.

إذا كان أكبر من %somany% kbytes, يجب أن يعيد توجيه مع GOTO إلى مكان آخر.

مثال:

[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
هل كانت مفيدة؟

المحلول

إذا تم استخدام اسم الملف كمعلمة إلى ملف دفعي، كل ما تحتاجه هو %~z1 (1 يعني المعلمة الأولى)

إذا لم يكن اسم الملف معلمة، فيمكنك القيام بشيء ما:

@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. ومع ذلك، كما هو مطلوب، لا يعمل فقط عند تمرير اسم الملف كمعلمة الأولى إلى ملف الدفعات.

عملت الشركات من خلال استخدام FOR, ، الذي، هو إصلاح عظيم 1 بطانة للمشكلة، ولكن، من الصعب بعض الشيء القراءة.

بدلا من ذلك، يمكننا العودة إلى إجابة أبسط مع٪ ~ Z1 باستخدام CALLوبعد إذا كان لديك اسم ملف مخزن في متغير بيئة، فسوف يصبح٪ 1 إذا كنت تستخدمه كمعلمة لروتين في ملف الدفعات الخاص بك:

@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

لقد كنت فضوليا حول قلق ج. بوفري فيما يتعلق بالقيود 32 بت. يبدو أنه يتحدث عن مشكلة مع استخدام LSS ليس على منطق filesize نفسه. للتعامل مع اهتمام J. Bouvrie، قمت بإعادة كتابة الحل لاستخدام مقارنة سلسلة مبطنة:

@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 يتوسع إلى حجم الوسيطة الأولى إلى الملف الدفعي. يرى

C:\> call /?

و

C:\> if /?

مثال بسيط:

@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

أفضل استخدام وظيفة DOS. يشعر أنظف لي.

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

إذا كان لديك %file% هي معلمة إدخال، قد تستخدم %~zN, ، أين N هو عدد المعلمة.

على سبيل المثال test.bat تحتوي

@echo %~z1

سيعرض حجم المعلمة الأولى، لذلك إذا كنت تستخدم "test myFile.txt"سيعرض حجم الملف المقابل.

كالعادة، يتوفر VBScript لاستخدامها .....

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

حفظ باسم filesize.vbs وأدخل في سطر الأوامر:

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

إستخدم for حلقة (دفعة) للحصول على نتيجة العودة.

مثال آخر

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

قم بإنشاء ملف دفعة سطر واحد GetFilesize.bat تحتوي على

GetFileSize=%~z1

ثم اتصل به

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.

يمكنك حتى إنشاء ملف الاختبار الخاص بك أثناء الطيران لإزالة الملف المطلوب PSKY، لاحظ المزدوج المزيني في بيان الصدى:

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

هذا الحل الأخير هو Antispaghetti. لطيف جدا. ومع ذلك، يكتب المزيد من القرص. تحقق من استخدام عدد.

رأيت للتو هذا السؤال القديم الذي يتطلع لمعرفة ما إذا كان Windows كان لديه شيء مدمج فيه. الشيء ~ Z هو شيء لم أكن أعرفه، ولكن لا ينطبق بالنسبة لي. انتهى بي الأمر مع Perl One-Liner:

@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

كان هذا حلاي لتقييم أحجام الملفات دون استخدام VB / PERL / ETC. والالتصاق مع أوامر قذيفة النوافذ الأصلية:

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

ليس منظف الحل، لكنه ينجز المهمة.

من المهم ملاحظة أنه حد INT32 من الدفعة: 'رقم غير صالح. تقتصر الأرقام على 32 بت من الدقة.

جرب العبارات التالية:

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

أي رقم أكبر من قيمة Max Int32 سيقتحم البرنامج النصي! يتم قياس رؤية الملفات في البايتات، وسوف تدعم البرامج النصية حجم ملفات بحوالي 255.9999997615814 ميغابايت!

بعد قليل من "محاولة واختبار" التكرارات لقد وجدت طريقة (لا تزال غير موجودة هنا) للحصول على حجم الملف في متغير دورة (وليس معلمة سطر الأوامر):

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

مجرد فكرة:

قد تحصل على الملفات عن طريق تشغيل الأمر "دير":

>dir thing

ثم مرة أخرى يعيد الكثير من الأشياء.

ربما يمكنك الحصول عليها من هناك إذا كنت تبحث عنه.

لكنني لست متأكدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top