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