我想重命名路径中的几个文件,最后添加一种时间戳。
我基于使用.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 /?"用法
如果有人能在这个问题上指导我,我感激不尽。谢谢
答案 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"
我希望我能帮到你。