【问题标题】:Defining these batch commands定义这些批处理命令
【发布时间】:2018-01-20 06:56:41
【问题描述】:

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

谢谢大家,我真的很感激。

【问题讨论】:

  • @user202729 所以不允许他提出合法的问题?这是一个格式正确的问题,他想成为 SO 的一部分。
  • 感谢@GerhardBarnard(我相信您对下面的答案有所帮助?)。我很感激。 User202729-实际上,我不知道您指的是哪个文档-如果很容易理解,那是我的疏忽-但是如果您指的是批处理命令中的默认“描述”,那么我已经已经阅读了,我也阅读了您在询问之前提供的链接。与您的假设相反,我在提出这个问题之前尝试做一些研究,以防这是一个重复的问题。但它对我和我的问题的帮助不如下面提供的答案。

标签: windows batch-file command


【解决方案1】:

有关文档,请参阅 命令名 /?根据提示。

dir /b /a-d filemask 执行目录列表 /b 仅指定文件名 - 没有大小、日期、页眉或页脚。 /a-d 不包括目录名。

您需要它来为for /f 命令提供名称。

for /f 读取括号中的“文件名”(它可以是真实文件名或单引号命令(如dir)或双引号文字字符串)并将值分配给元变量(在本例中为%%a)根据指定的选项(直接跟在/f 后面的引号部分)。

delims 选项指定使用哪一组字符来解析来自指定“文件”的数据行。然后该行被解释为一系列 tokens,由 delimiter-sequences 分隔。默认情况下,delimsSpaceTab。通常使用"...delims=" 完全关闭delims,在这种情况下,只有一个标记(整行)。请注意,delims=" 之间的任何字符都是同等级别且区分大小写的 - 它是由 替换 Space 的分隔符组成的 set制表符,而不是delimiter-string

tokens 选项指定从 1 开始按数字选择哪些标记。特殊标记 * 表示“指定的最大数字标记之后的行的其余部分(包括任何分隔符)”。默认为tokens=1

%%a 是一个元变量。它是保存从tokens= 列表中选择的第一个标记号的变量。每个选定的令牌编号都按字母顺序分配给下一个 元变量 名称,因此在您的示例中,由于您有 tokens=1-3 然后 %%a 是第一个令牌,%%b 第二个和@987654345 @ 第三。 元变量总是一个字母(有时会使用一些其他字符 - 但绝对不允许使用数字),并且名称区分大小写(通常,批处理不区分大小写)。 %%a%%A%a% 都是不同的变量。 %a%%A% 相同的 变量。

元变量仅在创建它的for 循环内有效。当for 循环结束时,变量消失。

@echo off 只是关闭批处理将产生的命令回显(在控制台上显示命令,然后执行它)。它用于减少显示器上的混乱。在调试一段代码时,通常将echo 设置为on (echo on) 然后再次关闭(echo off) 以准确显示正在执行的指令。 @ 表示“不要向控制台报告此命令”

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

【讨论】:

  • @GerhardBarnard :很好的发现。总是让那些默认值和需要转义的字符混淆。希望我现在已经一劳永逸地解决了这个问题。
  • 从技术上讲,/A-D 显示所有对象,包括只读、隐藏、准备归档、系统、未索引内容以及重新解析不是目录的点。一旦你使用/A,它实际上认为所有属性都是想要的,你需要使用not前缀-来取消选择不需要的属性。
  • 我不知道从哪里开始 - 非常感谢您花时间向我解释代码!我已经搜索了很多(似乎还不够好),但是您提供的内容非常有帮助!代码是通过“本能地”查看与我试图实现的主题相同的不同代码组合在一起的。在我得到什么有效之前主要是测试和试验,但直到现在才完全理解它。非常感谢!感谢 Compo - 提供额外的信息:D!你们摇滚!
  • @RogerTang 现在下一步是确定此答案是否解决了您的问题,如果解决了,您可以将其标记为正确,因为这将是一个已解决的解决方案,它可能会帮助其他有类似问题的用户未来的问题。
  • 太棒了!绝对做到了,现在也会这样做:D 谢谢@GerhardBarnard!
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 2021-08-24
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
相关资源
最近更新 更多