【问题标题】:Batch file to Auto update date in file name with for-in-do loop使用 for-in-do 循环将批处理文件自动更新为文件名中的日期
【发布时间】:2015-06-01 22:58:40
【问题描述】:

我今天有一个关于批处理文件的问题,因为我对它们完全陌生。我想创建一个主批处理文件来更新文件名中带有日期的其他批处理文件。
例如,文件名 = 测试文件 (20150101).txt。我想创建一个批处理文件来自动更新文件名末尾的日期,所以我不必每次都更改它。我试过使用

FOR /F "tokens=1-3 delims=/" %%a IN (test file(20150101)) DO (
SET _Month=%%a
SET _Day=%%b
SET _Year=%%c
)
ECHO Month %_Month%
ECHO Day %_Day%
ECHO Year %_Year%

这似乎不适用于我正在尝试做的事情。他们是完成它的更好方法吗请放轻松,因为我对此完全陌生

【问题讨论】:

  • 嗨--只是想为您节省很多痛苦、痛苦和时间。批处理语言在解析文本、读取、写入和操作数据等方面非常难以学习和理解。如果您刚开始编写脚本,请跳过学习批处理并专注于 PowerShell,因为它更容易学习等等强大。
  • PowerShell 不像批处理那样可移植,命令也不那么容易记住。 PowerShell 非常冗长,看起来它是由有打字癖的人开发的。只需双击它们即可运行批处理脚本。必须先在系统上正确配置 PowerShell,然后才能运行脚本,这使得将脚本部署到多台计算机非常痛苦。
  • 为什么要解析文件名?为什么不根据当前日期生成时间戳并简单地重命名文件?或者您打算让用户输入一个日期,然后批处理文件搜索名称中包含该日期的其他文件?我不清楚你在问什么。
  • Magoo,它现在似乎读取了文件,但是一旦它将新日期读入变量中,我如何让它显示文件名和更新日期?
  • @magoo。请参考之前的帖子。

标签: batch-file for-in-loop


【解决方案1】:

你的线路:

FOR /F "tokens=1-3 delims=/" %%a IN (test file(20150101)) DO (

将生成语法错误) was unexpected at this time,因为批处理将第一个) 视为关闭第一个括号(实际上将第二个( 视为另一个没有特殊含义的字符)。因此批处理将其解释为

FOR /F "tokens=1-3 delims=/" %%a IN (two strings)) DO (

并反对第二个),它期望do

下一个问题是您的文件名似乎是test file(20150101).txt,但您输入了test file(20150101)。这可能很重要,也可能不重要。

经典的解决方法是用插入符号来逃避流氓括号:

FOR /F "tokens=1-3 delims=/" %%a IN (test file(20150101^)) DO (

但这行不通,因为批处理仍然会看到两个字符串,而且都不可能是文件名。

所以解决这个问题的方法是

FOR /F "tokens=1-3 delims=/" %%a IN ("test file(20150101)") DO (

当然,他的故事还没有结束。由于这是一个"quoted string" 批处理,因此该批处理将把该精确字符串传递给for 以进行标记化。实际上,这似乎正是您想要做的,但for /f 通常用于读取文件的内容,而不是标记文本字符串。要读取文件test file(20150101) 的内容,您需要编码FOR /F "usebackqtokens=1-3 delims=/" %%a IN ("test file(20150101)") DO ( - 注意test file(20150101)test file(20150101).txt 是两个不同的文件名。

所以 - 下一步是解决问题

FOR /F "tokens=1-3 delims=/" %%a IN ("test file(20150101)") DO (

这将使用指定的分隔符将引号中字符串中的标记分配给%%a..%%c 由于该字符串中没有/,因此整个字符串将分配给@ 987654343@.

您似乎对20150101 部分感兴趣,所以

FOR /F "tokens=1-3 delims=()" %%a IN ("test file(20150101)") DO (

test file(20150101) 标记为 test file 20150101nothing

其实你只需要第二个token,所以

FOR /F "tokens=2 delims=()" %%a IN ("test file(20150101)") DO (

20150101 分配给%%a 所以

FOR /F "tokens=2 delims=()" %%a IN ("test file(20150101)") DO (set var=%%a)

将该值分配给var

下一步是使用子字符串将值应用于您要使用的变量。

set "_year=%var:~0,4%"
set "_month=%var:~4,2%"
set "_day=%var:~6,2%"

应该愉快地完成这项工作。

之后你用它做什么是任何人的猜测......

【讨论】:

  • Magoo,感谢您的帮助。现在似乎读取了文件,但是当我检查实际文件时,还没有更新文件名中的日期?基本上我会收到格式为 examplefile(20150505) 的文件,但日期会不正确。我需要脚本以上述格式自动更新日期
  • 您没有说要如何重命名文件或文件名的来源。也许它们在变量中-您没有透露这一点。重命名的命令是 `ren "test file(20150101)" "newname" 但不知道你想把文件重命名成什么,我们只能猜测。
  • 再次感谢您的回复。该文件不一定要重命名。每次我在收到的新文件上运行脚本时,我只需要将文件名中的日期部分更新为当前日期,该文件的日期不正确。该文件将是我将从外部来源接收的 (.sql) 文件。我不需要更改文件中的任何内容,只需更改文件名的日期部分。如果我要使用命令 ren "test file(20150101)。如何将日期替换为当前日期?我希望这更有意义
猜你喜欢
  • 2019-08-11
  • 2023-04-08
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
相关资源
最近更新 更多