gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:15:54 27 4
gpt4 key购买 nike

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

我根据使用 .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/?”供使用

如果你们中有人可以指导我解决这个问题,我将不胜感激。谢谢

最佳答案

呃。您遇到了使错误难以追踪的复杂问题。

在我解释您的代码如何失败之前,我将使用 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"

OK - 现在列出您原始代码中的许多问题,以及它们产生的影响。

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 参数解析器将引号之间的所有内容保留为单个参数,但 \"被转义,所以它一直持续到下一个引用。在下一个 " 之后没有 token 分隔符, 所以 cmd也包含在值中。

下一个标记是 /c这是一个需要值的有效选项。所以 ren被视为命令值。

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

避免这种讨厌的解析问题的简单方法是删除尾随的 \来自路径,因此参数根据需要以引号结尾:

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

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

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

关于windows - 使用 bat 文件执行重命名文件 - 无效的 FORFILES 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45826149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com