cmd中For循环的属性列表

Tre*_*vor 2 windows for-loop cmd batch-file

我正在寻找一个属性列表以及它们在命令提示符下的for循环中所做的事情.

具体来说,我有一个.bat文件,它从C:\驱动器的根目录复制文件,并将其粘贴到预先指定目录中找到的所有文件夹中(即C:\ Users\John\Test Directory).

这是命令:

@echo off
for /D %%a in (C:\Users\John\Test Directory\*.*) do xcopy /y /d C:\test_file.txt "%%a\"
Run Code Online (Sandbox Code Playgroud)

.bat正是我需要它做的事情,但我不明白命令中"%% a"的作用.我看到使用%% g,%% f等的类似命令,但没有定义为什么选择这些命令或者他们具体做什么.这些属性是任意的还是具有已定义的功能?我似乎无法找到有关属性的任何信息,所以任何见解都值得赞赏!

roj*_*ojo 5

随心所欲.您可以使用任何字母,上部或下部,甚至符号.

for %%# in... do command %%#
Run Code Online (Sandbox Code Playgroud)

也会起作用.但是,每次迭代使用多个令牌时,最好使用字母表.这是一个例子,原因如下:

for /f "usebackq tokens=1* delims==" %%I in ("textfile.txt") do (
    set "config[%%~I]=%%~J"
)
Run Code Online (Sandbox Code Playgroud)

这是因为%%I包含在第一个等号前面匹配的文本,并%%J包含第一个等号后的所有内容. 这个答案在上下文中显示了这个例子

您的问题的答案在for命令的文档中暗示. help for在cmd控制台中获取完整详细信息.特别:

一些例子可能有帮助:

FOR/F"eol =; tokens = 2,3*delims =,"(myfile.txt)中的%i执行@echo%i%j%k

将解析myfile.txt中的每一行,忽略以分号开头的行,将第2和第3个标记从每行传递给for body,并用逗号和/或空格分隔标记.注意for body语句引用%i获取第二个标记,%j获取第三个标记,%k获取第3个标记之后的所有剩余标记.

本页进一步解释:

FOR参数

必须使用单个字符定义第一个参数,例如字母G.

FOR %%G IN ...

在FOR循环的每次迭代中,IN(....)子句被计算并%%G设置为不同的值

如果此子句导致单个值,则将%%G其设置为等于该值并执行命令.

如果子句导致多个值,则隐式定义额外参数以保存每个参数.这些是按字母顺序自动分配的%%H %%I %%J...(隐式参数定义)

如果参数引用文件,则可以使用增强变量引用来提取文件名/路径/日期/大小.

你当然可以挑选除字母之外的任何字母%%G.

%%G是一个很好的选择,因为它不与任何路径名格式字母(a,d,f,n,p,s,t,x)冲突,并提供最长的非冲突字母用作隐式参数. G > H > I > J > K > L > M
格式字母区分大小写,因此使用大写字母也是避免冲突的好方法,%%A而不是%%a.

为了彻底的利益,应该指出:

  • for在cmd控制台中使用时,使用单个百分比.
  • for在bat脚本中使用时,使用双倍百分比.
  • 检索迭代变量时使用波形符号从值中去除周围的引号.(例如"Hello world!"变成Hello world!).使用它来强制所需的格式很方便. "%%~G"将始终引用,是否引用了捕获的值.在使用for循环捕获文件名时,应始终执行此操作.
  • Tilde表示法还允许扩展路径,检索文件大小和其他转换.有关help for更多详细信息,请参阅cmd控制台中的最后几页.