有人可以帮我制作一个脚本,可以根据文件的名称在文件夹(和子文件夹)中构建文件吗?

Could someone help me make a script that could structure files in folders (and subfolders) depending on their names?

我知道有很多脚本可以执行此类任务,但我找不到任何可以执行我专门搜索的内容...

我正在寻找一个脚本,它可以读取文件夹中的所有文件,将所有“_”分开并将它们放入子文件夹中。

文件名的结构如下所示:

Clothes_Man_Citizen_Pants.png
Clothes_Man_Citizen_Top.png

脚本随后将创建具有以下结构的子文件夹:

Clothes/Man/Citizen/Clothes_Man_Citizen_Pants.png
Clothes/Man/Citizen/Clothes_Man_Citizen_Top.png

我问这个是因为我找不到任何 photoshop 脚本来导出 photoshop 中的嵌套组...所以我将所有图层导出到一个文件夹中,并想用批处理创建嵌套文件夹结构或类似的东西。

感谢您的回答!

编辑:

在伪代码中它看起来像这样:

InitialName = Clothes_Man_Citizen_Pants.png;
TempName = Clothes_Man_Citizen_Pants.png;

While (There is an underscore in TempName) {
    -> Read name until underscore
    -> Create folder with name
    -> Get into created folder
    -> Remove part from TempName
    -> Repeat
}

当 TempName 中不再有下划线时,将带有 InitialName 的文件粘贴到上次创建的文件夹中。

@echo off
    setlocal enableextensions disabledelayedexpansion

    for %%a in (*.png) do (
        rem Retrieve file name and extension
        set "fileName=%%~nxa"

        rem Prepare the folder from filename
        rem Filenames not splitted by underscores will be skipped
        setlocal enabledelayedexpansion 
        for %%b in ("::\!fileName:_=\!") do endlocal & if not "%%~pb"=="\" %"% ( set "folder=%%~pb" ) else ( set "folder=" ) 

        rem If we have a target folder, ...
        if defined folder (
            rem We need a mask to move all the files in a folder in one command

            rem First remove leading and trailing backslashes
            setlocal enabledelayedexpansion 
            for %%b in ("!folder:~1,-1!") do endlocal & set "mask=%%~b"

            rem Now replace backslashes with underscores and add wildcard and extension
            setlocal enabledelayedexpansion 
            for %%b in ("!mask:\=_!") do endlocal & set "mask=%%~b_*.png"

            rem Create the target folder and move the files 
            setlocal enabledelayedexpansion 
            if not exist ".!folder!" md ".!folder!"
            move /y "!mask!" ".!folder!" 
            endlocal 
        )
    )

这会获取文件名,将下划线替换为反斜杠,并使用生成的字符串作为文件夹层次结构来执行所有操作。

需要 setlocal / endlocal 来处理 name/path 文件中感叹号 (!) 的可能性。如果永远不会是这种情况,可以从一开始就启用延迟扩展(代码中需要),并且可以将之前的代码减少到

@echo off
    setlocal enableextensions enabledelayedexpansion

    for %%a in (*.png) do (
        set "fileName=%%~nxa"
        for %%b in ("::\!fileName:_=\!") do if not "%%~pb"=="\" %"% ( set "folder=%%~pb" ) else ( set "folder=" )
        if defined folder (
            set "mask=!folder:~1,-1!"
            set "mask=!mask:\=_!_*.png"
            if not exist ".!folder!" md ".!folder!"
            move /y "!mask!" ".!folder!" 
        )
    )

注意:在这两个代码中你都可以找到%"%,这是不需要的。包含它只是为了更正由于代码中的 "\" 而失败的语法突出显示。

试试这个:

编辑:原始代码有一个错误。现已修复...

@echo off
setlocal EnableExtensions EnableDelayedExpansion

for %%a in (*.png) do (
   set "filename=%%a"
   for %%b in (!filename:_= !) do set "lastPart=%%b"
   for %%b in (!lastPart!) do set "filename=!filename:_%%b=!"
   md "!filename:_=\!" 2> NUL
   move "%%a" "!filename:_=\!"
)

如果文件名可能包含空格、逗号或分号,此方法将失败。它还会删除感叹号。