Команда Windows только для размера файла?

Есть ли команда Windows, которая выведет размер в байтах указанного файла, как это?

>filesize test.jpg
65212

Я знаю, что команда dir выводит эту информацию, но она также выводит и другую информацию.

Я мог бы легко написать такую ​​программу, но я бы предпочел использовать встроенную команду Windows, если это возможно, или только ту, которая доступна в новой установке Windows XP.

14 ответов

Решение

Если вы находитесь внутри пакетного скрипта, вы можете использовать переменные аргумента для получения размера файла:

filesize.bat:

@echo off
echo %~z1

Это дает результаты, подобные тем, которые вы предлагаете в своем вопросе.

Тип

help call

в командной строке для всех безумных опций манипулирования переменными. Также см. Эту статью для получения дополнительной информации.

Изменить: это работает только в Windows 2000 и более поздних версиях

Если вы не хотите делать это в пакетном скрипте, вы можете сделать это из командной строки следующим образом:

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

Ужасно, но это работает. Вы также можете передать маску файла, чтобы получить список для нескольких файлов:

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

Будет отображаться размер, имя файла каждого файла.DOC.

Используйте функцию, чтобы избавиться от некоторых ограничений в операторе ~z, особенно полезно для цикла for:

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

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

Попробуйте forfiles:

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

forfiles команда запускает команду c для каждого файла m в каталоге p,

Переменная @fsize заменяется размером каждого файла.

Если файл C:\Temp\file1.txt составляет 27 байт, forfiles запускает эту команду:

cmd /c echo 27

Какие отпечатки 27 на экран.

Как побочный эффект, он очищает ваш экран, как будто вы запустили cls команда.

Поскольку вы используете XP, Windows PowerShell является опцией.

(Get-Item filespec ).Length 

или как функция

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

Создайте filesize.cmd (и поместите в C:\Windows\System32):

@echo %~z1
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 (.).

Взяты отсюда:

Следующая команда находит папки размером более 100 МБ на диске D:

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

Параметр / s вызывает поиск в подкаталогах, параметр / m отображает использование диска в мегабайтах, параметр /q:100 позволяет помечать папки размером более 100 МБ, а параметр / d отображает только папки, превышающие пороговое значение определяется /q.

Используйте команду diskuse, чтобы найти файлы определенного размера. Следующая команда отображает файлы размером более 100 МБ на диске D:

diskuse D: /x:104857600 /v /s

Параметр /x:104857600 позволяет отображать файлы размером более 104 857 600 байт и действует только при включении параметра / v (подробный). Параметр / s означает поиск подкаталогов по указанному пути (в данном случае диск D:).

Использование 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

Это не совсем то, о чем вы спрашивали, и его можно использовать только из командной строки (и он может быть бесполезен в командном файле), но один быстрый способ проверить размер файла - просто использовать dir:

> dir Microsoft.WindowsAzure.Storage.xml

Результаты в:

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

В пакетном файле ниже работает для локальных файлов, но не для файлов на сетевых жестких дисках

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

Однако это неполноценный код, поскольку он не работает с файлами, сохраненными на сетевом диске (например, \Nas\test.jpg, \192.168.2.40\test.jpg). Приведенный ниже код работает с файлами в любом месте, написал его сам. Я уверен, что есть более эффективные способы сделать это с помощью VBS, PowerShell или чего-то еще, но я не хотел делать ничего из этого, хорошая старая партия для меня!

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

В Powershell вы можете сделать:

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

файл данных wmic, где имя ='c:\\windows\\system32\\cmd.exe' получить размер файла /формат:значение

Насчет удаленных не уверен, но для локальной винды через {Общий доступ к файлам/Сеть}, %~zработает

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

Более обобщенная версия этого . Предыдущая версия может не требовать enableDelayedExpansion enableExtensions, но не могу запустить forпетли .

  • Некоторое уточнение --
    • |нельзя использовать для передачи выходного значения в set; for /fне поддерживает некоторые символы в значении темы (путь для редактирования), если без внутритекстового экранирования; for /lне позволяет изменять значения счетчика/условия (после старта); !<<variableName>>:<<escaped text>>*!не работает.
    • at keepOnlyAllBefore1stSpace передается вместо !nu_f!, потому что это необходимо по той же причине/использованию, что и %%%%xсделано, чтобы быть созданным.
      @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

В Powershell вы ДОЛЖНЫ сделать это:

(Get-ChildItem C: \ TEMP \ file1.txt). Длина

Другие вопросы по тегам