使用bat文件执行重命名文件 - 无效的FORFILES选项

时间:2017-08-22 20:07:41

标签: windows batch-file

我想重命名路径中的几个文件,最后添加一种时间戳。​​

我基于使用.bat文件的快速研究创建了以下脚本:

@ECHO off
set Time="%TIME:~0,2%%TIME:~3,2%"
set Time=%Time: =%
Forfiles /P "C:\Batches\ftp_outputfiles\" /M *.txt /C "cmd /c ren @file @fname-%date:~6,4%%date:~3,2%%date:~0,2%%Time%.txt"

但是,系统会返回消息:

错误:无效的参数/选项 - ' @ file' 。 输入" FORFILES /?"用法

如果有人能在这个问题上指导我,我感激不尽。谢谢

2 个答案:

答案 0 :(得分:4)

唉。你有复杂的问题,使得bug很难追查。

在我解释你的代码失败之前,我会用FOR而不是FORFILES给你一个更简单,更快的解决方案。

我还使用WMIC以可靠的方式获取时间戳,而不是操纵%DATE%%TIME%,这可能会失败,具体取决于计算机配置。我的代码生成的时间戳为YYMMDDhhmm,这是我认为您正在努力的目标。

@echo off
setlocal
set "ts="
for /f "skip=1" %%A in ('wmic os get localDateTime') do if not defined ts set "ts=%%A"
for %%F in ("C:\Batches\ftp_outputfiles\*.txt") do ren %%F "%%~nF-%ts:~0,12%.txt"

好的 - 现在列出原始代码中的许多问题及其效果。

1)您永远不应该定义自己的TIME变量,因为这会阻止后续代码访问动态TIME值。

2)您忘记在顶部使用SETLOCAL,因此在脚本终止后您的TIME定义仍然存在。这意味着后续运行不再获取动态TIME值,而是从先前运行中获取结果的子串。

3)不是真正的错误,但你不需要变量值中的引号。最好使用set "var=someValue"代替set var="someValue"。前者从解析的角度引用表达式,但引号不包括在赋值中。后一种形式包括值中的引号。

4)导致意外错误消息的最终错误 - FORFILES命令将\"视为转义引用,因此\ P值比您想象的要长得多!

您的代码(缩写)是

Forfiles /P "C:\Batches\ftp_outputfiles\" /M *.txt /C "cmd /c ren @file @fname-...txt"

/ P选项需要一个解析为的值:
"C:\Batches\ftp_outputfiles\" /M *.txt /C "cmd

FORFILES参数解析器将引号之间的所有内容保留为单个参数,但\"被转义,因此它一直持续到下一个引号。在下一个"之后没有令牌分隔符,因此cmd也包含在值中。

下一个标记是/c,它是一个需要值的有效选项。因此ren被视为命令值。

下一个标记是@FILE,这不是有效选项。因此ERROR: Invalid argument/option - '@file'.错误消息。

避免这种令人讨厌的解析问题的简单方法是从路径中删除尾随\,以便参数根据需要以引号结束:

forfiles /P "C:\Batches\ftp_outputfiles" /M ....

另一种选择是删除引号,但这只能起作用,因为你的路径没有像需要引号的空格这样的字符。

forfiles /P C:\Batches\ftp_outputfiles\ /M ....

答案 1 :(得分:0)

你可以尝试:

@ECHO off
set Time="%TIME:~0,2%%TIME:~3,2%"
set Time=%Time: =%
Forfiles /P C:\Batches\ftp_outputfiles\ /M *.txt /C "cmd /c rename @file @fname1-%date:~6,4%%date:~3,2%%date:~0,2%%Time%.txt"

我希望我能帮到你。