Как найти размер файла только с помощью командной оболочки 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.

Есть идеи о том, что я делаю не так? ТИА!

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 - размер файла в байтах...

Если вы хотите использовать фактическую переменную среды внутри этого 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 до того, как цикл используется.

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

robocopy /L (dir вы хотите размер) (C:\ произвольная папка) . / Журнал:(C:\ произвольная папка \robolog.txt)

Это создаст документ, который имеет размер findstr Байт C:\robocopylog.txt >>getsize.txt

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

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

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

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

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

PS C:\test> Get-ChildItem *.txt | ForEach-Object { Write-Host $_.name, $_.length }
test.txt 16
test2.txt 5
Другие вопросы по тегам