gpt4 book ai didi

Windows 批处理文件在 FOR 循环中无法解释地重命名文件名

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

Windows 批处理文件在 FOR 循环中无法解释地重命名文件名

我有一个小的 Windows 7 批处理文件来重命名 MP3 文件名库。我在这个问题中只包含了最后几行代码。除了将变量中的文本字符串(艺术家姓名)附加到目录中的每个文件名的代码部分存在一个问题外,它工作正常。 (一旦解决,我的批处理文件将使用“set/p var=”来提示输入文本来填充变量。)

用于此测试的两个示例文件名是:

01-serious song.mp3
02-happy song.mp3

这段代码出现问题:

@echo off
setlocal enabledelayedexpansion
::Temporay test variable
set str=Artist-
for %%a in (*.mp3) do (
set oldName=%%a
set newName=!str!!oldName!
ren "!oldName!" "!newName!"
)
endlocal

结果是 02 文件最后附加了一次字符串(如预期的那样),而 01 文件名附加了两次字符串(错误):

Artist-Artist-01-serious song.mp3
Artist-02-happy song.mp3

我梳理了 Internet,但没有找到任何关于这种情况的讨论。我不想说我自己花了大约 8 个小时来完成它。经过多次测试和研究,我相信重命名语句以某种方式导致了这种情况。

所以我更改了批处理文件以调用其中包含重命名命令的子例程,认为它会干扰 for 语句。那还是有问题。然后我使用如下所示的 echo 命令编辑批处理文件以对其进行测试。

第二版测试:

@echo off
setlocal enabledelayedexpansion
set str=Artist-
for %%a in (*.mp3) do (
set oldName=%%a
set newName=!str!!oldName!
call :Action
echo.
echo back in For loop
)
echo.
echo For loop completed
echo !oldName!
echo !newName!
endlocal
goto:eof

:Action
echo.
echo start of Action loop
echo !oldName!
echo !newName!
ren "!oldName!" "!newName!"
echo end of Action loop

这是 CMD 屏幕上显示的结果输出:

start of Action loop
01-serious song.mp3
Artist-01-serious song.mp3
end of Action loop

back in For loop

start of Action loop
02-happy song.mp3
Artist-02-happy song.mp3
end of Action loop

back in For loop

start of Action loop
Artist-01-serious song.mp3
Artist-Artist-01-serious song.mp3
end of Action loop

back in For loop

For loop completed
Artist-01-serious song.mp3
Artist-Artist-01-serious song.mp3

这很有趣,因为它显示子例程被正确调用并返回了两次。然后它以某种方式被第三次调用,显然它再次重命名了 01 文件,第二次附加了变量。

如果我将 echo 放在 ren 语句之前,那么屏幕输出会显示该子例程仅被调用两次,但它当然不会重命名文件。我也尝试使用移动命令而不是重命名,得到了同样的问题结果。

所以,我的问题是,为什么 for 循环调用子程序三次并使 01 文件被处理两次,我怎样才能让它按预期工作?

谢谢你,皮特。

最佳答案

尝试

for /f "delims=" %%a in (' dir /b /a-d *.mp3') do (

问题是您的原始语法找到了下一个文件名 - 它找到了您重命名的文件,因为新文件名(带有前缀)在逻辑上“大于”旧文件名。

使用 dir 构建文件名列表,并在列表完全构建后对其进行处理 - 因此列表不会随着文件重命名而改变。

"delims=" 子句确保文件名的默认解析无效 - 否则,文件名将被解释为一系列 [空格分隔] 标记。

关于Windows 批处理文件在 FOR 循环中无法解释地重命名文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204571/

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