首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在批处理文件中拆分目录地址(回收)?

如何在批处理文件中拆分目录地址(回收)?
EN

Stack Overflow用户
提问于 2018-03-21 20:21:06
回答 1查看 105关注 0票数 1

我有音频示例文件夹,我将删除我不使用的内容,但是我想在SQLite数据库中记录原始内容。

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

使用此批处理代码创建一个目录树,如我的文件系统+虚拟文件,用于测试。它将在执行文件的任何地方创建。(在我的例子中,顶部文件夹名为Testing

代码语言:javascript
复制
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"

借助帮助,我成功地创建了一个数据库并创建了一些条目,但是我的输出如下所示:

当我想要的是:

我认为问题在于代码中的分隔符。此外,我还需要代码来处理缺少Type值的问题(将其留给NULL)

所以..。

电流码

代码语言:javascript
复制
@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:'=''!"
    )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-22 11:00:52

代码语言:javascript
复制
@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%路径中与发布者、包、类别和类型的列值匹配的部分。

然后遍历该目录中的文件,并将sql语句插入到sql文件中。

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

标签:part中的:part循环使用2-5的标记。这将将%%A设置为Publisher,将%%B设置为Pack,将%%C设置为Category,将%%D设置为Type。根据匹配路径段所需的内容调整2-5的令牌设置。

标签:part中设置的当前变量设置为NULL,如果未定义变量,则变量为单引号转义,并添加外部单引号。因此,可以按原样插入。类似于File循环中的for变量。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49415833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档