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
这就是为什么会这样的描述
但是,如果您不需要查询隐藏文件的大小,那么有一种更好的方法可以通过使用不依赖于当前工作目录的barefor
命令来获取特定目录中的文件大小
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中的%变量
部分,而变量
描述了该部分中使用的字母。当然,每个人都可能有一个最喜欢的术语。我只是问:为什么不使用原始文档中出现的术语?如果我们使用似乎很流行的东西,那么我们就可以帮助传播不良做法,特别是在批处理文件的情况下@黑暗的东西