定义这些批处理命令

时间:2018-01-20 06:56:41

标签: windows batch-file command

在过去的几年里,我确实发现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 offpause?

谢谢你们,我真的很感激。

1 个答案:

答案 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设置为echoon)然后再关闭(echo on)以正确显示正在执行的指令是正常的。 echo off表示“不向控制台报告此命令”

@只是等待,直到从键盘收到响应。它用于允许读取显示而不是简单地直接继续下一条指令。它通常用于调试,并且如果使用点击和傻笑来执行批处理,则允许为用户保留批处理的结果。