Liam
Liam

Reputation: 20940

Windows command for file size only

Is there a Windows command that will output the size in bytes of a specified file like this?

> filesize test.jpg
65212

I know that the dir command outputs this information, but it outputs other information also.

I could easily write such a program, but I would prefer to use a native Windows command if possible, or only what is available in a fresh install of Windows XP.

Upvotes: 53

Views: 231474

Answers (15)

Ted T
Ted T

Reputation: 1

For some reason, on XP I had a lot of trouble with People's code, the following works for me, but only in batch file.

@echo off

for %%a in (file.dll) do echo .Size of %%A is %%~zA bytes

pause

Everything else here that I tried failed.

And just so the result can be sorted by size:

@echo off

for %%a in (file.dll) do echo %%~zA bytes is %%A

pause

Upvotes: 0

Ivan  Ivanov
Ivan Ivanov

Reputation: 11

wmic datafile where name='c:\\windows\\system32\\cmd.exe' get filesize /format:value

Upvotes: 1

irvnriir
irvnriir

Reputation: 806

I'm not sure about remote ones, but for local Windows trough {File Sharing / Network}, %~z does work

for %%x in ("\\ComputerName\temp\temp.txt") do set "size=%%~zx"

More generalized version of this . The previous version may be not requiring enableDelayedExpansion enableExtensions, but can't run in for loops .

  • Some clarification --
    • | can't be used to pass an output value to set ; for /f doesn't support some characters in it's subject value (the path to edit), if without in-text Escaping ; for /l doesn't allow to change the count/condition values (after start) ; !<<variableName>>:<<escaped text>>*! doesn't work .
    • at keepOnlyAllBefore1stSpace, %%%%x is passed instead of !nu_f!, because that is needed for the same reason/use as %%%%x is made to be created .
@setLocal enableDelayedExpansion enableExtensions
@echo off

set "file=C:\Users\Admin\Documents\test.jpg"

for %%x in ("!file!") do set "name=%%~nxx"
for %%x in ("!file!") do set "storage=%%~pdx"
    set "storage=!storage:~0,-1!"

dir "!storage!" > "!temp!\fileInfo.txt"

findstr /c:"!name!" "!temp!\fileInfo.txt" > "!temp!\fileInfo_1.txt"
    del "!temp!\fileInfo.txt"
set /p "size=" < "!temp!\fileInfo_1.txt"
    del "!temp!\fileInfo_1.txt"

call :for 1 2 "call :deleteCollumnFromStart size"

call :for 1 1 "call :keepOnlyAllBefore1stSpace %%%%x size"

:removeSpacesFromEnd
    if /i "!size:~-1!" equ " " set "size=!size:~0,-1!"
    if /i "!size:~-1!" equ " " goto removeSpacesFromEnd

echo(!size:,= ! bytes

pause
exit /b


:deleteCollumnFromStart
    set "%~1=!%~1:* =!"
    :removeAllSpacesFromStart
        if /i "!%~1:~0,1!" equ " " set "%~1=!%~1:~1!"
        if /i "!%~1:~0,1!" equ " " goto removeAllSpacesFromStart
goto :eof

:keepOnlyAllBefore1stSpace
    if /i "!%~2:~%~1,1!" equ " " (
        set "%~2=!%~2:~0,%~1!"
    ) else (
        set /a "nu1_f= !nu1_f! + 1"
    )
goto :eof

:for
    set "nu_f=%~1"
    set "nu1_f=%~2"
    :f_repeatTimes
        if not !nu1_f! lss !nu_f! (
            rem echo(f_repeatTimes !nu_f! !nu1_f! %*
            for %%x in (!nu_f!) do (
                %~3
            )
            set /a "nu_f= !nu_f! + 1"
            goto f_repeatTimes
        )
goto :eof

Upvotes: 0

XFlak
XFlak

Reputation: 19

In a batch file, the below works for local files, but fails for files on network hard drives

for %%I in ("test.jpg") do @set filesize=%~z1

However, it's inferior code, because it doesn't work for files saved on a network drive (for example, \\Nas\test.jpg and \\192.168.2.40\test.jpg). The below code works for files in any location, and I wrote it myself.

I'm sure there are more efficient ways of doing this using VBScript, or PowerShell or whatever, but I didn't want to do any of that; good ol' batch for me!

set file=C:\Users\Admin\Documents\test.jpg
set /a filesize=
set fileExclPath=%file:*\=%

:onemoretime
set fileExclPath2=%fileExclPath:*\=%
set fileExclPath=%fileExclPath2:*\=%
if /i "%fileExclPath%" NEQ "%fileExclPath2%" goto:onemoretime

dir /s /a-d "%workingdir%">"%temp%\temp.txt"
findstr /C:"%fileExclPath%" "%temp%\temp.txt" >"%temp%\temp2.txt"

set /p filesize= <"%temp%\temp2.txt"

echo set filesize=%%filesize: %fileExclPath%%ext%=%% >"%temp%\temp.bat"
call "%temp%\temp.bat"

:RemoveTrailingSpace
if /i "%filesize:~-1%" EQU " " set filesize=%filesize:~0,-1%
if /i "%filesize:~-1%" EQU " " goto:RemoveTrailingSpace

:onemoretime2
set filesize2=%filesize:* =%
set filesize=%filesize2:* =%
if /i "%filesize%" NEQ "%filesize2%" goto:onemoretime2

set filesize=%filesize:,=%
echo %filesize% bytes

SET /a filesizeMB=%filesize%/1024/1024
echo %filesizeMB% MB

SET /a filesizeGB=%filesize%/1024/1024/1024
echo %filesizeGB% GB

Upvotes: 1

user5814704
user5814704

Reputation: 41

Create a file named filesize.cmd (and put into folder C:\Windows\System32):

@echo %~z1

Upvotes: 4

David Doum&#232;che
David Doum&#232;che

Reputation: 517

Use a function to get rid off some limitation in the ~z operator. It is especially useful with a for loop:

@echo off
set size=0
call :filesize "C:\backup\20120714-0035\error.log"
echo file size is %size%
goto :eof

:: Set filesize of first argument in %size% variable, and return
:filesize
  set size=%~z1
  exit /b 0

Upvotes: 17

eccieThe Techie
eccieThe Techie

Reputation:

In PowerShell you should do this:

(Get-ChildItem C:\TEMP\file1.txt).Length

Upvotes: 0

Scott Weinstein
Scott Weinstein

Reputation: 19117

Since you're using Windows XP, Windows PowerShell is an option.

(Get-Item filespec ).Length 

or as a function

function Get-FileLength { (Get-Item $args).Length }
Get-FileLength filespec

Upvotes: 6

klyde
klyde

Reputation: 215

In PowerShell you can do:

$imageObj = New-Object System.IO.FileInfo("C:\test.jpg")    
$imageObj.Length

Upvotes: 1

Nikita R.
Nikita R.

Reputation: 7493

This is not exactly what you were asking about and it can only be used from the command line (and may be useless in a batch file), but one quick way to check file size is just to use dir:

> dir Microsoft.WindowsAzure.Storage.xml

Results in:

Directory of C:\PathToTheFile

08/10/2015  10:57 AM         2,905,897 Microsoft.WindowsAzure.Storage.xml
               1 File(s)      2,905,897 bytes
               0 Dir(s)  759,192,064,000 bytes free

Upvotes: 0

Kanagavelu Sugumar
Kanagavelu Sugumar

Reputation: 19260

C:\>FORFILES  /C "cmd /c echo @fname @fsize"


C:\>FORFILES  /?

FORFILES [/P pathname] [/M searchmask] [/S]
         [/C command] [/D [+ | -] {MM/dd/yyyy | dd}]

Description:
    Selects a file (or set of files) and executes a
    command on that file. This is helpful for batch jobs.

Parameter List:
    /P    pathname      Indicates the path to start searching.
                        The default folder is the current working
                        directory (.).

Upvotes: 2

eccieThe Techie
eccieThe Techie

Reputation:

Try forfiles:

forfiles /p C:\Temp /m file1.txt /c "cmd /c echo @fsize"

The forfiles command runs command c for each file m in directory p.

The variable @fsize is replaced with the size of each file.

If the file C:\Temp\file1.txt is 27 bytes, forfiles runs this command:

cmd /c echo 27

Which prints 27 to the screen.

As a side-effect, it clears your screen as if you had run the cls command.

Upvotes: 13

Mick
Mick

Reputation: 13475

Taken from here:

The following command finds folders that are greater than 100 MB in size on the D: drive:

diruse /s /m /q:100 /d d:

The /s option causes subdirectories to be searched, the /m option displays disk usage in megabytes, the /q:100 option causes folders that are greater than 100 MB to be marked, and the /d option displays only folders that exceed the threshold specified by /q.

Use the diskuse command to find files over a certain size. The following command displays files over 100 MB in size on the D: drive:

diskuse D: /x:104857600 /v /s

The /x:104857600 option causes files over 104,857,600 bytes to be displayed and is valid only if you include the /v option (verbose). The /s option means subdirectories from the specified path (in this case, the D: drive) are searched.

Using VBScript

' This code finds all files over a certain size.
' ------ SCRIPT CONFIGURATION ------
strComputer = "**<ServerName>**" 
intSizeBytes = 1024 * 1024 * 500  ' = 500 MB
' ------ END CONFIGURATION ---------
set objWMI = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
set colFiles = objWMI.ExecQuery _
    ("Select * from CIM_DataFile where FileSize > '" & intSizeBytes & "'")
for each objFile in colFiles
    Wscript.Echo objFile.Name & "  " & objFile.Filesize / 1024 / 1024 & "MB"
next

Upvotes: 1

Patrick Cuff
Patrick Cuff

Reputation: 29786

If you don't want to do this in a batch script, you can do this from the command line like this:

for %I in (test.jpg) do @echo %~zI

Ugly, but it works. You can also pass in a file mask to get a listing for more than one file:

for %I in (*.doc) do @echo %~znI

Will display the size, file name of each .DOC file.

Upvotes: 51

Kothar
Kothar

Reputation: 6629

If you are inside a batch script, you can use argument variable tricks to get the filesize:

filesize.bat:

@echo off
echo %~z1

This gives results like the ones you suggest in your question.

Type

help call

at the command prompt for all of the crazy variable manipulation options. Also see this article for more information.

Edit: This only works in Windows 2000 and later

Upvotes: 51

Related Questions