如何在批处理中递归拆分目录路径?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
代码说明:
- 目录结构:你可以根据自己真实的文件夹结构修改
mkdir的行,确保和原结构一致; - 虚拟文件:用
fsutil创建指定大小的空文件,模拟真实音频文件的大小,格式随机从常见音频格式中选择; - CSV生成:自动遍历所有音频文件,记录路径、名称、大小,同时处理文件名中的双引号避免CSV格式错误;
- SQLite导入:用SQLite原生的
.import命令,直接批量导入CSV,效率远高于逐个写入数据库。
内容的提问来源于stack exchange,提问作者Stack Johan
相关产品推荐
相关产品推荐

