for %a in (*) do ( set tmpx=%a & echo %tmpx% )
前面代码的问题是扩展延迟。是的,您启用了它,但您没有使用它,并且取决于您启用它的方式,它不会起作用
在cmd
中,当到达一行或一行行(括号内的代码)时,首先对其进行解析然后执行。在解析阶段,从命令中删除变量读取操作,替换为命令开始执行之前变量中的值。因此,如果您更改行/块内的变量值,则无法在同一行/块内检索更改的值,因为没有变量读取(它们已被替换)
setlocal enabledelayedexpansion
允许(在需要时)从 to 替换变量读取语法,%var%
向!var!
解析器指示读取操作将延迟到执行阶段。
因此,就您而言,您的代码应该类似于
setlocal enabledelayedexpansion & for %a in (*) do ( set "tmpx=%a" & echo !tmpx! )
但这不起作用(在默认配置的环境中)。
cmd
有两种执行模式:批处理文件和命令行。for
在您的情况下,您正在使用命令行(循环中没有转义的百分号)并且在命令行模式下setlocal enabledelayedexpansion
将不起作用。它适用于批处理文件(请参阅setlocal /?
)
如何使其从命令行工作?默认情况下cmd
以禁用延迟扩展启动,如果不在批处理文件中,则无法启用它。但是您可以从cmd
启用延迟扩展开始并在这个启动的实例中运行您的命令(请参阅 参考资料cmd /?
)
cmd /v:on /c "for %a in (*) do ( set "tmpx=%a" & echo !tmpx! )"
无论如何,要解决您的重命名问题,不需要延迟扩展
for %a in (*_*.tif) do for /f "tokens=1,* delims=_" %b in ("%~nxa") do echo ren "%a" "%c"
即对于每个tif
带下划线的文件,将文件名和扩展名%~nxa
(%b
并将其余文本(下划线右侧)放入%c
. 现在,只需将原始文件名(存储在 中%a
)重命名为%c
(下划线右侧的文本)的内容
在此代码中,重命名操作仅回显到控制台。如果输出正确,请删除该echo
命令。