Почему%~z игнорируется? (партия, ЗА)

Первая из этих двух работ, вторая ничего не дает:
FOR / f %% a in ('dir C: \ / b') do (echo %% a)
FOR / f %% a in ('dir C: \ / b') do (echo %% ~ za)

Первая из этих двух работ, вторая ничего не дает:
FOR / f "tokens = 5 delims =" %% a in ('dir C: \') do (echo %% a)
FOR / f "tokens = 5 delims =" %% a in ('dir C: \') do (echo %% ~ za)

Первая из этих двух работ, вторая ничего не дает:
FOR / f "delims =" %% a in ('dir C: \') do (echo %% a)
FOR / f "delims =" %% a in ('dir C: \') do (echo %% ~ za)

Та же история в командной строке.

Работают другие модификаторы (%%~fa, %%~nxa, %%~pna и т. Д.)
Когда z включен с другими модификаторами, %% a изменяется
в соответствии с другими модификаторами, z не имеет никакого эффекта.

Win10 1803

0 ответов

~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

sst пишет: "сменить текущий каталог"

Это решило это.

sst пишет: "верно и для других модификаторов (~f, ~d, ~p)"

Правда для тех. Любопытно ненужно для ~n и ~x.

Другие вопросы по тегам