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

时间:2018-01-03 00:07:33

标签: windows batch-file

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

我找到了一个方法here,基本上就是我需要做的事情。我还发现了问题herehere,这些问题显示了如何将环境变量赋值给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.

我做了什么stoopid明显的错误?

1 个答案:

答案 0 :(得分:1)

正如Mangoo所说,enabledelayedexpansion关闭时存在初始问题,这意味着您的!variables!无法根据需要进行解析。此外,mkdir没有将参数放在引号中存在问题,这意味着如果您有一集名为“第1集'”,那么它会尝试制作文件夹' Episode& #39;和' 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的强大且可自定义的音频播放器,还包括其他工具的瑞士军刀用于管理标签,转换音频,当然还有file operations!购买和下载新曲目后,我将此用于我自己的音乐库。由于它可以轻松读取ID3标签,我可以告诉它按艺术家名称制作文件夹并重命名文件以反映曲目名称。如果你的曲目被正确标记,这比仅仅查看文件名更具灵活性。