gpt4 book ai didi

windows - 如何在批处理文件中(递归地)分割目录地址?

转载 作者:行者123 更新时间:2023-12-03 03:11:22 25 4
gpt4 key购买 nike

我有音频样本的文件夹,我打算删除不使用的内容,但我想在 SQLite 数据库中记录原始内容。

目前,我正在直接写入数据库,但我认为写入 .CSV文件并导入数据库会更快,因为有数百个文件。

使用此批处理代码创建一个目录树,例如我的文件系统+虚拟文件,以进行测试。它将在您执行该文件的任何位置创建。 (在我的例子中,顶部文件夹被命名为 Testing :

SET "BigFish=Z. Unsorted\Big Fish Audio\Midnight Jazz Train\Brass and Winds"
SET "Fragments=Z. Unsorted\Loopmasters\Fragments 02\FR2_SOUNDS_&_FX\FR2_BASS"
SET "LCycles=Z. Unsorted\Loopmasters\Hip-Hop Lunar Cycles\LUN_SYNTH_MELODY_LOOPS"

FOR %%A IN (Tenor_Sax, Trumpet) DO MD "%BigFish%\%%A"
MD "%Fragments%"
MD "%LCycles%"

@echo justtestjunk > "%Fragments%\loop.wav"
@echo justtestjunk > "%LCycles%\drum.aiff"
@echo justtestjunk > "%LCycles%\file.txt"
FOR %%A IN (Tenor_Sax, Trumpet) DO echo justtestjunk > "%BigFish%\%%A\data.sql"

在帮助下,我成功创建了一个数据库并进行了一些输入,但我的输出如下所示:

enter image description here

当我想要的是这样的时候:

enter image description here

我认为问题出在代码中的分隔。另外,我需要代码来处理 Type 的缺失。值(保留 NULL )

所以...

当前代码

@echo off

setlocal enabledelayedexpansion

SET fld="Z. Unsorted"

sqlite3 %fld%\TestDb.sqlite "CREATE TABLE IF NOT EXISTS \"Samples\" (File TEXT NOT NULL, Publisher TEXT, Pack TEXT NOT NULL, Category TEXT, Type TEXT, Size INT);"

for /r %fld% %%A in (*.aiff *.wav) do (
call :part "%%~dpA"

set "File=%%~nxA"
set "File=!File:'=''!"

sqlite3 %fld%\TestDb.sqlite "INSERT OR REPLACE INTO \"Samples\" VALUES ('!File!', '!Publisher!', '!Pack!', '!Category!', '!Type!', '%%~zA');"

@echo '!File!', '!Publisher!', '!Pack!', '!Category!', '%%~zA'
)

PAUSE

:part
for /f "tokens=6-10 delims=\" %%A in ("%~1") do (
set "Publisher=%%~A"
set "Publisher=!Publisher:'=''!"

set "Pack=%%~B"
set "Pack=!Pack:'=''!"

set "Category=%%~C"
set "Category=!Category:'=''!"

set "Type=%%~D"
set "Type=!Type:'=''!"
)

最佳答案

@echo off

setlocal enabledelayedexpansion

set "fld=Z. Unsorted"

> "%fld%\TestDb.sql" (
echo BEGIN;
echo CREATE TABLE IF NOT EXISTS "Samples" ^(File TEXT NOT NULL, Publisher TEXT, Pack TEXT NOT NULL, Category TEXT, Type TEXT, Size INT^);
)

for /r "%fld%" %%A in (*.aiff *.wav) do (
set "relative_path=%%~dpA"
set "relative_path=!relative_path:%cd%=!"
if "!relative_path:~,1!" == "\" set "relative_path=!relative_path:~1!"

call :part "!relative_path!"

set "File=%%~nxA"
set "File='!File:'=''!'"

>> "%fld%\TestDb.sql" echo INSERT OR REPLACE INTO "Samples" VALUES ^(!File!, !Publisher!, !Pack!, !Category!, !Type!, %%~zA^);

@echo !File!, !Publisher!, !Pack!, !Category!, !Type!, %%~zA
)

>> "%fld%\TestDb.sql" echo COMMIT;

sqlite3 -cmd ".read '%fld%\TestDb.sql'" "%fld%\TestDb.sqlite" ""

pause
exit /b

:part
for /f "tokens=2-5 delims=\" %%A in ("%~1") do (
set "Publisher=%%~A"
if defined Publisher (
set "Publisher='!Publisher:'=''!'"
) else set "Publisher=NULL"

set "Pack=%%~B"
if defined Pack (
set "Pack='!Pack:'=''!'"
) else set "Pack=''"

set "Category=%%~C"
if defined Category (
set "Category='!Category:'=''!'"
) else set "Category=NULL"

set "Type=%%~D"
if defined Type (
set "Type='!Type:'=''!'"
) else set "Type=NULL"
)
exit /b

代码对某些变量使用enabledelayedexpansion。那是对于变量,使用 ! 而不是 %.

使用 for 循环通过递归来解析目录以查找文件。

call :part "!relative_path!" 行获取 %fld% 路径的部分与 Publisher、Pack、Category 和 Type 的列值相匹配。

然后它会遍历该目录中的文件并插入sql语句写入sql文件。

可能包含'的sql插入值被转义为''

标签 :part 中的 for 循环使用 2-5 标记。这会将 %%A 设置为 Publisher,将 %%B 设置为 Pack%%C > 到 类别 并将 %%D 更改为 类型。将 2-5 的 token 设置调整为所需的值匹配路径段。

如果变量设置在标签 :part 中,则当前变量设置为 NULL未定义,否则该变量是单引号转义的并且是外部的添加单引号。因此,准备好按原样插入。类似的做法到 for 循环中的 File 变量。

relative_path 变量是删除了 %cd% 的绝对路径从中删除可能的前导反斜杠。应该更容易在 :part 标签的 for 循环中进行 tokenize。

关于windows - 如何在批处理文件中(递归地)分割目录地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49415833/

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