Batch file %~z在循环的批处理文件中被忽略

Batch file %~z在循环的批处理文件中被忽略,batch-file,for-loop,Batch File,For Loop,这两部作品中的第一部,第二部什么都没有: 用于('dir C:\/b')do(echo%%a)中的/f%%a 对于('dir C:\/b')中的/f%%a,执行(echo%%~za) 这两部作品中的第一部,第二部什么都没有: FOR/f“tokens=5 delims=“%%a in('dir C:\')do(echo%%a) 对于/f“tokens=5 delims=“%%a in('dir C:\')do(echo%%~za) 这两部作品中的第一部,第二部什么都没有: FOR/f“del

这两部作品中的第一部,第二部什么都没有:

用于('dir C:\/b')do(echo%%a)中的/f%%a
对于('dir C:\/b')中的/f%%a,执行(echo%%~za)
这两部作品中的第一部,第二部什么都没有:

FOR/f“tokens=5 delims=“%%a in('dir C:\')do(echo%%a)
对于/f“tokens=5 delims=“%%a in('dir C:\')do(echo%%~za)
这两部作品中的第一部,第二部什么都没有:

FOR/f“delims=“%%a in('dir C:\')do(echo%%a)
对于/f“delims=“%%a in('dir C:\')do(echo%%~za)
同样的情况也发生在cmd中

其他修饰符也可以工作,例如:
%%~fa、%%~nxa、%%~pna
、e.t.c。
z
包含在其他修饰符中时,
%%a
根据其他修饰符进行修改,
z
无效。

~z
修饰符返回
的元变量引用的文件大小。

要使其工作,元变量(
%%a
)必须指向现有文件,并且该文件必须可以从当前目录访问。

如果
%%a
是文件的绝对路径(例如
C:\MyFile.txt
),那么执行
FOR
命令的
目录并不重要,而是当它是相对路径时(例如
MyFile.txt
)然后,它将尝试查找相对于当前目录的文件
MyFile.txt
,并查询其大小

dir/b
仅输出文件名,而不是文件的完整路径,因此
~z
修饰符的行为取决于您当前的工作目录。(
dir/s/b
返回完整路径,但也输出所有子目录中的文件)

例如,如果在执行
For
循环之前将当前目录更改为
C:\
,则它将生成预期结果:

cd /D C:\
for /F "delims=" %%A in ('dir C:\ /b /a-d') do (echo %%~zA)
其他修饰符(
~f
~d
~p
)也是如此,虽然它们似乎可以工作并输出一些内容,但根据上下文的不同,它们返回的值可能不是您期望的值,因为完整路径(
~f
)或驱动器号(
~d
)基于当前工作目录计算

for %%A in (C:\*) do echo %~zA
这就是为什么会这样的描述

但是,如果您不需要查询隐藏文件的大小,那么有一种更好的方法可以通过使用不依赖于当前工作目录的bare
for
命令来获取特定目录中的文件大小

for %%A in (C:\*) do echo %~zA
sst写道:“更改当前目录”

这就解决了问题

sst写道:“其他修饰符也是如此(~f,~d,~p)”


对那些人来说也是如此。奇怪的是,~n和~x不需要。

您在
C:\
目录中有实际文件吗?在所有MS CMD.exe文档中,包括
for/?
帮助屏幕中,
%%a
部分称为可替换参数。为什么称之为元变量?我从未在任何正式的批处理文件文档中看到过这个术语。。。IMHO最好使用原始术语。我想这可能是我第一次使用术语
meta
来解决变量的
。我不是这个词的粉丝,我只是看到它被一些成员用来避免与环境变量混淆,而且在这里也被使用了很多次,所以我使用了一些读者可能更熟悉的东西。实际上,术语
可替换参数
FOR/?
文档中仅使用一次,用于描述变量的
,文档的其余部分使用术语
变量
。术语
可替换参数
只是增加了更多的混淆,而不是消除它。但那只是我,欢迎任何人编辑和使用更合适的术语。我喜欢“元变量”,因为从技术上讲,它不是字母
a
,而是ASCII值97的表示,这就是为什么可以使用(几乎)
循环变量的
的128个基本ASCII值中的任意一个。如果仔细阅读
for/F
帮助屏幕,您会发现可替换参数指的是for description中的
%变量
部分,而
变量
描述了该部分中使用的字母。当然,每个人都可能有一个最喜欢的术语。我只是问:为什么不使用原始文档中出现的术语?如果我们使用似乎很流行的东西,那么我们就可以帮助传播不良做法,特别是在批处理文件的情况下@黑暗的东西