在过去的几年里,我确实发现Stackoverflow非常有用,并决定创建一个帐户 - 这是我的第一篇文章。
示例情况 - 我有很多这些不同主题的图像 -
AAA_BBB_randomDigits_front.jpg
AAA_BBB_randomDigits_left.jpg
AAA_BBB_randomDigits_right.jpg
ZZZ_EEE_randomDigits_front.jpg
ZZZ_EEE_randomDigits_left.jpg
ZZZ_EEE_randomDigits_right.jpg
我希望他们都能在文件夹中分组为 -
AAA_BBB_randomDigits\(contains left, front and right)
ZZZ_EEE_randomDigits\(contains left, front and right)
我目前的代码有效 -
@echo off
for /f "tokens=1-3 delims=_" %%a in ('dir /b /a-d *_*_*_*.*') do (
md "%%a_%%b_%%c" 2>nul
move "%%a_%%b_%%c*" "%%a_%%b_%%c"
)
pause
但是,如果有人能向我解释,我会很高兴 -
%%a?
dir /b /a-d
,我为什么需要它?@echo off
和pause?
谢谢你们,我真的很感激。
答案 0 :(得分:2)
有关文档,请参阅 commandname /?从提示。
dir /b /a-d filemask
执行目录列表/b
仅指定文件名 - 没有大小,日期,页眉或页脚。 /a-d
排除了目录名。
您需要它来为for /f
命令提供名称。
for /f
读取括号中的“文件名”(可以是真实文件名或单引号命令(如dir
)或双引号文字字符串)并将值赋给< em> metavariable (在本例中为%%a
)根据指定的选项(直接在/f
之后的引号中的部分)。
delims
选项指定用于解析从指定的“文件”到达的数据行的字符集。然后该行被解释为一系列标记,由分隔符序列分隔。默认情况下,delims
为 Space 和 Tab 。通常使用delims
完全关闭"...delims="
,在这种情况下,只有一个令牌(整个行)。请注意,delims=
和"
之间的任何字符都具有同等排名且区分大小写的字符 - 它是set
分隔符,替换 Space 和 Tab ,而不是delimiter-string
。
tokens
选项指定从1开始按编号选择哪些令牌。特殊标记*
表示“指定最高编号标记后面的行的其余部分(包括任何分隔符) )”。默认情况下,tokens=1
。
%%a
是元变量。它是保存从tokens=
列表中选择的第一个标记号的变量。每个选定的令牌编号按字母顺序分配给下一个元变量名称,因此在您的示例中,由于您有tokens=1-3
,因此%%a
是第一个令牌,{{1}第二个和%%b
第三个。 Metavariables 总是一个字母(有时会使用其他一些字符 - 但绝对不允许使用数字)并且名称区分大小写(通常,批处理不区分大小写)。 %%c
,%%a
和%%A
都是不同的变量。 %a%
和%a%
是相同的变量。
元变量仅在创建它的%A%
循环中有效。当for
循环结束时,变量消失。
for
只是关闭批处理器会产生的命令回显(在控制台上显示命令,然后执行它)。它用于减少显示屏上的混乱。在调试一段代码时,将@echo off
设置为echo
(on
)然后再关闭(echo on
)以正确显示正在执行的指令是正常的。 echo off
表示“不向控制台报告此命令”
@
只是等待,直到从键盘收到响应。它用于允许读取显示而不是简单地直接继续下一条指令。它通常用于调试,并且如果使用点击和傻笑来执行批处理,则允许为用户保留批处理的结果。