You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在批处理中递归拆分目录路径?CSV导入SQLite记录音频文件

嘿,我来帮你搞定这两个批处理相关的问题,都是很实用的场景哦~

1. 如何在批处理文件中递归拆分目录路径?

要在批处理里递归拆分目录路径(比如把C:\a\b\c拆成C:\、C:\a\、C:\a\b\、C:\a\b\c\),可以结合递归子函数和批处理的变量扩展功能来实现。下面是一个可直接运行的示例代码:

@echo off
setlocal enabledelayedexpansion

:: 替换成你要拆分的目标路径
set "target_path=C:\test\audio_samples\na_folder\sub1\sub2"

:: 调用递归拆分函数
call :split_path "%target_path%"

pause
goto :eof

:: 递归拆分路径的核心子函数
:split_path
set "current_path=%~1"
:: 这里可以替换成你的实际处理逻辑(比如写入CSV、数据库等)
echo 当前层级路径: !current_path!

:: 获取当前路径的父目录
for %%d in ("!current_path!\.") do set "parent_dir=%%~dpd"
:: 去掉父目录末尾的反斜杠,判断是否到达根目录
set "parent_dir=!parent_dir:~0,-1!"
if not "!parent_dir!"=="" call :split_path "!parent_dir!"
goto :eof

代码说明:

  • enabledelayedexpansion:启用延迟变量扩展,确保递归过程中变量能正确更新;
  • %%~dpd:批处理的变量扩展语法,用来获取指定目录的驱动器+父路径;
  • 递归终止条件:当父目录为空时(到达根目录),停止递归。你可以把echo那行换成自己的业务逻辑,比如把每个层级的路径写入CSV。

2. 生成模拟目录树+虚拟文件,以及CSV转SQLite的高效性说明

你说的先写CSV再导入SQLite的思路非常正确!直接逐个写入数据库会产生大量的连接和事务开销,而CSV是磁盘批量写入,再用SQLite原生的.import命令导入,速度至少快几倍,几百个文件的场景下优势尤其明显。

下面是批处理代码,帮你生成和原文件结构一致的模拟目录树+虚拟音频文件(顶层文件夹用na_samples作为示例,你可以修改成自己的名称),同时附带生成CSV文件的逻辑:

@echo off
setlocal enabledelayedexpansion

:: 顶层文件夹名称(替换成你实际的na开头文件夹)
set "top_folder=na_samples"

:: ====================== 1. 创建模拟目录结构 ======================
:: 这里可以根据你的真实目录结构修改,按需添加/删除mkdir行
mkdir "%top_folder%\vocals\male" >nul 2>&1
mkdir "%top_folder%\vocals\female" >nul 2>&1
mkdir "%top_folder%\effects\ambience" >nul 2>&1
mkdir "%top_folder%\effects\sfx" >nul 2>&1
mkdir "%top_folder%\background\acoustic" >nul 2>&1

:: ====================== 2. 生成虚拟音频文件 ======================
set "file_formats=wav mp3 flac ogg"

:: 遍历所有子目录,每个目录生成3-5个虚拟文件
for /r "%top_folder%" %%d in (.) do (
    set "dir_path=%%~fd"
    :: 随机生成3-5个文件(!random!%%3+3 等价于 3到5之间的随机数)
    for /l %%i in (1,1,!random!%%3+3) do (
        :: 随机选一种音频格式
        set "fmt=!file_formats:~!random!%%16,4!"
        set "fmt=!fmt: =!"  :: 去掉格式字符串里的空格
        :: 创建指定大小的空文件(大小在500KB-1.5MB之间)
        fsutil file createnew "!dir_path!\sample_%%i.!fmt!" !random!%%1000000+500000 >nul 2>&1
        echo 创建虚拟文件: !dir_path!\sample_%%i.!fmt!
    )
)

:: ====================== 3. 生成CSV文件(用于后续导入SQLite) ======================
set "csv_file=audio_inventory.csv"
:: 写入CSV表头
echo "文件完整路径","文件名","文件大小(字节)" > "%csv_file%"

:: 遍历所有音频文件,写入CSV
for /r "%top_folder%" %%f in (*.wav *.mp3 *.flac *.ogg) do (
    set "file_path=%%~ff"
    set "file_name=%%~nf%%~xf"
    set "file_size=%%~zf"
    :: 转义文件名中的双引号(避免CSV格式错误)
    set "file_path=!file_path:"=\"!"
    set "file_name=!file_name:"=\"!"
    echo "!file_path!","!file_name!",!file_size! >> "%csv_file%"
)

echo.
echo 操作完成!
echo - 模拟目录树已生成:%cd%\%top_folder%
echo - 文件清单已写入CSV:%cd%\%csv_file%
echo.
echo 导入SQLite的命令示例(打开SQLite命令行后执行):
echo sqlite3 your_audio_db.db ".mode csv" ".import audio_inventory.csv audio_files"

pause
goto :eof

代码说明:

  1. 目录结构:你可以根据自己真实的文件夹结构修改mkdir的行,确保和原结构一致;
  2. 虚拟文件:用fsutil创建指定大小的空文件,模拟真实音频文件的大小,格式随机从常见音频格式中选择;
  3. CSV生成:自动遍历所有音频文件,记录路径、名称、大小,同时处理文件名中的双引号避免CSV格式错误;
  4. SQLite导入:用SQLite原生的.import命令,直接批量导入CSV,效率远高于逐个写入数据库。

内容的提问来源于stack exchange,提问作者Stack Johan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:53:35