将环境变量设置为 for 循环 %%i 变量(批处理脚本)



这是我写过的第一个批处理脚本。我正在尝试遍历当前文件夹,找到所有.mp3文件,然后为每个与文件标题相同但没有文件扩展名的 mp3 文件创建一个文件夹(然后将文件移动到其各自的文件夹中,添加称为 ffmpeg 将它们拆分为较短的块,但我还没有达到这一点)。

我在这里找到了一种方法,基本上完全可以完成我需要做的事情。我还在这里和这里发现了一些问题,这些问题显示了如何将环境变量分配给 for 循环变量,但它对我不起作用。

这是我的代码。

@ECHO OFF 
cd C:test
for %%i in (*.mp3) do (  
echo %%i
set episodeName=%%i
set episodeName=!episodeName:~0,-4!
echo !episodeName!
mkdir !episodeName!
)

这是我的输出。

C:test>"file splitter.bat"
171 Election.mp3
!episodeName!
172 24 Hours at the Golden Apple.mp3
!episodeName!
A subdirectory or file !episodeName! already exists.

我犯了什么明显的错误?

正如Mangoo所说,最初的问题是enabledelayedexpansion关闭,这意味着你的!variables!不会根据需要被解析。此外,mkdir没有将参数放在引号中存在问题,这意味着如果您有一个名为"第 1 集"的剧集,那么它将尝试将文件夹设为"剧集"和"1"而不是单个文件夹。有了这些修复,在循环中添加了一个额外的move命令,并在最后pause检查输出,你最终会得到以下结果。

@echo off
setlocal enabledelayedexpansion
cd C:test
for %%i in (*.mp3) do (  
echo %%i
set episodeName=%%i
set episodeName=!episodeName:~0,-4!
echo !episodeName!
mkdir "!episodeName!"
move "%%i" "!episodeName!%%i"
)
pause

如果你打算经常这样做,我可能还建议使用Foobar2000,它除了是一个强大且可定制的Windows音频播放器外,还包括一把瑞士军刀,用于管理标签,转换音频,当然还有文件操作!购买和下载新曲目后,我将其用于自己的音乐库。由于它可以轻松读取ID3标签,因此我可以告诉它按艺术家姓名制作文件夹并重命名文件以反映曲目名称。这为您提供了比仅查看文件名更大的灵活性,如果您的曲目已正确标记。

最新更新