Как узнать размер файла только с помощью командной оболочки Windows?

Я пытаюсь написать скрипт, который проверяет, больше ли размер файла 0, и если да, печатает «больше». Я просмотрел этот вопрос и получил несколько хороших идей. Я попытался реализовать то, что ответил второй ответчик, но это не работает должным образом.

Это то, что у меня есть до сих пор:

for %%i in (*.txt) do (
set size=0
set /A size=%%~zi
echo %%i %size%
if %size% GTR 0 echo greater
)

Когда я пробую это, он продолжает давать мне одинаковый размер для всех файлов, хотя я знаю, что один из них отличается. Когда я удаляю set size=0, если размер файла равен 0, выдает ошибку 0 was unexpected at this time.

Любые идеи о том, что я делаю неправильно?


person chama    schedule 02.05.2011    source источник


Ответы (5)


Попробуйте эту команду:

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

Когда я запускаю это, я получаю следующий результат в Windows 7:

C:\Users\Leniel\Desktop>for %I in (*.txt) do @echo %~znI
14 test1
34 test2

где 14 и 34 - размер файла в байтах...

person Leniel Maccaferri    schedule 02.05.2011

Если вы хотите использовать фактическую переменную среды внутри этого блока for, вам нужно отложенное расширение:

setlocal enabledelayedexpansion

for %%i in (*.txt) do (
  set size=0
  set /A size=%%~zi
  echo %%i !size!
  if !size! GTR 0 echo greater
)

Также обратите внимание, что вам нужно заменить %size% на !size!, чтобы активировать отложенное расширение вместо обычного.

Проблема в том, что обычные переменные среды раскрываются при анализе оператора; блок for является единственным оператором в этом отношении. Таким образом, как только цикл запускает значение size из до, цикл используется.

Отложенное расширение (с !) расширяет переменные непосредственно перед выполнением, а не при анализе оператора, поэтому вы увидите обновленное значение внутри цикла.

person Joey    schedule 02.05.2011

robocopy /L (каталог нужного вам размера) (C:\произвольная папка) . /Log:(C:\произвольная папка\robolog.txt)

Это создаст документ размером findstr Bytes C:\robocopylog.txt >>getsize.txt.

Вы можете использовать For/? чтобы помочь перейти к последней записи getsize.txt, которая должна содержать размер всего каталога. Вам нужно будет решить, является ли это k для кило, m для мегабайтов или g для гигов. Это можно решить, поскольку robocopy использует 0 в качестве заполнителей, поэтому вам нужно будет получить только 3-й и 4-й токен последней строки. 514,46 м

person user2796806    schedule 01.11.2013

Я не уверен, почему это вызвало проблему, но этот код работал.

for %%i in (*.txt) do (
echo %%i %%~zi
echo %%~zi
if %%~zi GTR 0 echo greater
)

Я думаю, это было связано с заменой и сбросом переменной %size%. Я все еще хотел бы заменить %%~zi именем переменной, но я думаю, что оставлю это, если это сработает.

person chama    schedule 02.05.2011

Вот как это сделать в PowerShell. Надеюсь, это убедит вас перейти на более современную оболочку:

PS C:\test> Get-ChildItem *.txt | ForEach-Object { Write-Host $_.name, $_.length }
test.txt 16
test2.txt 5
person Community    schedule 02.05.2011