Команда 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). Длина