Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何在Windows批处理脚本中检查文件的大小?_Batch File_Filesize - Fatal编程技术网

Batch file 如何在Windows批处理脚本中检查文件的大小?

Batch file 如何在Windows批处理脚本中检查文件的大小?,batch-file,filesize,Batch File,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 ex

我想要一个批处理文件,用于检查文件的
文件大小

如果它大于
%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
只是一个想法:

您可以通过运行命令“dir”获得文件大小:

然后它又返回了很多东西

如果你找的话,也许你可以从那里得到它


但我不确定。

像往常一样,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
循环(批处理)获得返回结果。

如果
%file%
是一个输入参数,可以使用
%zN
,其中
N
是参数的编号

例如,a
test.bat
包含

@echo %~z1
GetFileSize=%~z1

将显示第一个参数的大小,因此如果使用“
test myFile.txt
”,它将显示相应文件的大小。

%~z1
扩展到批处理文件的第一个参数的大小。看

C:\> call /?

简单的例子:

@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

如果文件名用作批处理文件的参数,则只需
%~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
)
@echo关闭
setlocal
set file=“test.cmd”
设置maxbytesize=1000
对于(“%file%”中的/F“usebackq”%%A,请设置大小=%%~zA
如果%size%LSS%maxbytesize%(
echo.File为^<%maxbytesize%字节
)否则(
echo.File为^>=%maxbytesize%字节
)

刚看到这个老问题,想看看Windows是否内置了一些东西。~z这件事我不知道,但不适合我。我最终得到了一个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

这是我的解决方案,用于评估文件大小,而不使用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  
    )
)  
不是最干净的解决方案,但它可以完成任务。

另一个例子

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

我更喜欢使用DOS功能。我觉得更干净

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

GOTO :EOF

:FileSize
SET %~2=%~z1

GOTO :EOF

创建一行批处理文件GetFileSize.bat,其中包含

@echo %~z1
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.
您甚至可以动态创建测试文件,以消除讨厌的必需文件,请注意echo语句中的双百分比:

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

后一种解决方案是反帕切蒂。太好了。然而,更多的磁盘写入。检查使用计数。

需要注意的重要一点是批次的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.999997615814 MB的最大文件大小

我喜欢@Anders的回答,因为对%%z1秘酱的解释。 但是,正如所指出的,只有当文件名作为 批处理文件的第一个参数

@Anders通过为
使用
,解决了这个问题,这是对
问题是,但是,它有点难读

相反,我们可以使用
CALL
返回到一个简单的答案,使用%%z1。 如果将文件名存储在环境变量中,它将变为 %1如果将其用作批处理文件中例程的参数:

@echo关闭
setlocal
set file=test.cmd
设置maxbytesize=1000
调用:设置大小%file%
如果%size%lss%maxbytesize%(
回显文件小于%maxbytesize%字节
)否则(
回显文件大于或等于%maxbytesize%字节
)
后藤:eof
:设置大小
设置大小=%~z1
后藤:eof
我一直很好奇J.Bouvrie对32位限制的担忧。他似乎在谈论一个关于使用
LSS
而不是文件大小逻辑本身的问题。为了解决J.Bouvrie的问题,我重写了使用填充字符串比较的解决方案:

@echo on
setlocal
set file=test.cmd
设置maxbytesize=1000
调用:设置大小%file%
设置checksize=00000000000000%size%
设置checkmaxbytesize=00000000000000%maxbytesize%
如果“%checksize:~-20%”lss“%checkmaxbytesize:~-20%”(
回显文件小于%maxbytesize%字节
)否则(
回显文件大于或等于%maxbytesize%字节
)
后藤:eof
:设置大小
设置大小=%~z1
后藤:eof
经过几次“尝试和测试”迭代之后,我找到了一种方法(这里仍然没有)来获取cycle变量中的文件大小(不是命令行参数):


你需要两样东西

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,但由于我想重命名传输中的文件,所以我不得不使用@#$!!批处理脚本。

您能解释一下“usebackq”选项的帮助吗?它似乎与文件大小无关,但如果我删除它,它就会停止working@JoelFan:如果没有usebackq,“quote”表示命令而不是字符串(有关详细信息,请运行/?)另一种替代方法(更好地处理文件名中的空格)是使用:FOR/F“tokens=*”%%A in(“%file%”)DO…Hi@Anders当我在一个序列中有多个文件时,你能告诉我如何做同样的事情吗。就像我想设置如果我的文件小于2kb,那么将其移动到一个diff文件夹?。我的结果应该测试路径中的每个文件并进行验证。旁注:在测试之前,您应该检查文件是否存在。否则,文件大小将只是一个空字符串。。。我花了一段时间才注意到。没关系。。。它甚至不工作,写入一个变量为我现有的文件…这是不正确的。我创建了一个5 GB的文件,能够使用%%z1读取它的文件大小,它报告了5056590344。这是因为它仍然是一个字符串,没有转换成数字。尝试使用Set/a进行比较或算术运算,任何大于2 GB的操作都将失败。将NTFS转换为FAT32时,确定
for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )