我想要一个批处理文件来检查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
答案 0 :(得分:94)
如果文件名用作批处理文件的参数,则只需%~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
)
答案 1 :(得分:12)
FOR
解决了这个问题,这是一个很好的1-liner修复
问题,但是,它有点难以阅读。
相反,我们可以使用CALL
回到%~z1更简单的答案。
如果您有一个存储在环境变量中的文件名,它将成为
如果您将它用作批处理文件中例程的参数,则为%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 %maxbytesize% bytes
)
goto :eof
:setsize
set size=%~z1
goto :eof
答案 2 :(得分:11)
%~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
答案 3 :(得分:9)
我更喜欢使用DOS功能。感觉更干净。
SET SIZELIMIT=1000
CALL :FileSize %1 FileSize
IF %FileSize% GTR %SIZELIMIT% Echo Large file
GOTO :EOF
:FileSize
SET %~2=%~z1
GOTO :EOF
答案 4 :(得分:8)
如果您的%file%
是输入参数,则可以使用%~zN
,其中N
是参数编号。
E.g。一个test.bat
包含
@echo %~z1
将显示第一个参数的大小,因此如果您使用“test myFile.txt
”,它将显示相应文件的大小。
答案 5 :(得分:4)
像往常一样,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
循环(批量处理)获取返回结果。
答案 6 :(得分:4)
另一个例子
FOR %I in (file1.txt) do @ECHO %~zI
答案 7 :(得分:2)
创建包含
的单行批处理文件GetFileSize.batGetFileSize=%~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.
您甚至可以动态创建测试文件以消除讨厌的必需文件,请注意echo语句中的双倍百分比:
echo set GetFileSize=%%~z1 > %temp%\GetFileSize.bat
call %temp%\GetFileSize myfile.txt
if (%GetFileSize) GTR 1000 goto Too_Much_Data
rem etc
后一种解决方案是antispaghetti。很好。但是,更多的磁盘写入。检查使用次数。
答案 8 :(得分:1)
刚刚看到这个老问题,看看Windows是否有内置的东西。这个东西是我不知道的,但不适用于我。我最终得到了一个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
答案 9 :(得分:1)
这是我在不使用VB / perl / etc的情况下评估文件大小的解决方案。并坚持使用本机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
)
)
不是最干净的解决方案,但它可以完成工作。
答案 10 :(得分:0)
经过一些“尝试和测试”迭代后,我找到了一种方法(这里仍然不存在)来获取循环变量(不是命令行参数)中的文件大小:
for %%i in (*.txt) do (
echo %%~z%i
)
答案 11 :(得分:0)
您将需要两件事。
filesize.bat
@echo off
echo %~z1
然后是您实际尝试的尺寸。
仅复制大于零的文件/仅复制非零文件
for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )
我找到了这个线程,几乎是我需要的 ,我尝试了一堆不同的东西-这有点令人沮丧,因为robocopy看起来有/ min:1,但由于我捆绑了所有东西想重命名传输中的文件,这使我不得不使用@#$!批处理脚本。
答案 12 :(得分:-1)
需要注意的重要事项是批次的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!)
任何大于最大INT32值的数字都会打破脚本!看到filesize以字节为单位,脚本将支持最大文件大小约为255.9999997615814 MB!
答案 13 :(得分:-4)
只是一个想法:
您可以通过运行命令“dir”来获取文件大小:
>dir thing
然后它又返回了很多东西。
如果你找的话,也许你可以从那里得到它。
但我不确定。