Как найти размер файла только с помощью командной оболочки Windows? - PullRequest
4 голосов
/ 02 мая 2011

Я пытаюсь написать скрипт, который проверяет, больше ли размер файла, чем 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 ]

2 голосов
/ 02 мая 2011

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

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

1 голос
/ 01 ноября 2013

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

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

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

1 голос
/ 02 мая 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 от до , цикл используется.

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

0 голосов
/ 02 мая 2011

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

PS C:\test> Get-ChildItem *.txt | ForEach-Object { Write-Host $_.name, $_.length }
test.txt 16
test2.txt 5
0 голосов
/ 02 мая 2011

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

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

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

...