Модификатор ~z
возвращает размер файла, на который ссылается мета-переменная FOR
.
Для работы мета-переменная (%%a
) должна указывать на существующийфайл и файл должны быть доступны из текущего каталога.
Если %%a
является абсолютным путем к файлу (например, C:\MyFile.txt
), то не имеет значения, из какого каталога выполняется команда FOR
, Но когда это относительный путь (например, MyFile.txt
), он попытается найти файл MyFile.txt
относительно текущего каталога и запросить его размер.
dir /b
выводит только имена файлов,не полный путь к файлам, поэтому поведение модификатора ~z
зависит от вашего текущего рабочего каталога.(dir /s /b
возвращает полные пути, но также выводит файлы во всех подкаталогах)
Например, если вы измените текущий каталог на C:\
перед выполнением цикла FOR
, он даст ожидаемый результат:
cd /D C:\
for /F "delims=" %%A in ('dir C:\ /b /a-d') do (echo %%~zA)
Это верно и для других модификаторов (~f
, ~d
, ~p
), хотя они, кажется, работают и что-то выводят, но в зависимости от контекста, значения онивозврат может не соответствовать ожидаемому, поскольку полный путь (~f
) или буква диска (~d
) рассчитываются на основе текущего рабочего каталога.
Это было описание того, почему этотак оно и есть.
Но если вам не нужно запрашивать размер скрытых файлов, то есть лучший способ получения размеров файлов внутри определенного каталога с помощью команды FOR
, котораяне зависит от текущего рабочего каталога.
for %%A in (C:\*) do echo %~zA