% ~ z игнорируется в пакетном файле для цикла - PullRequest
0 голосов
/ 02 декабря 2018

Первая из этих двух работ, вторая ничего не дает:

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)

То же самое происходит в cmd.

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

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

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

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

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

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

0 голосов
/ 02 декабря 2018

Модификатор ~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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...