有人可以帮我制作一个脚本,可以根据文件的名称在文件夹(和子文件夹)中构建文件吗?
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:_=\!"
)
如果文件名可能包含空格、逗号或分号,此方法将失败。它还会删除感叹号。
我知道有很多脚本可以执行此类任务,但我找不到任何可以执行我专门搜索的内容...
我正在寻找一个脚本,它可以读取文件夹中的所有文件,将所有“_”分开并将它们放入子文件夹中。
文件名的结构如下所示:
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:_=\!"
)
如果文件名可能包含空格、逗号或分号,此方法将失败。它还会删除感叹号。