我是一个spine动画师,由于之前的项目经常和程序对接,所以会一点点代码。
spine批量导出一直是一个鲜少有人讨论的事情,由于项目需要,几年前写过一个简陋的批处理脚本,最近发现官方发布了spine批量导出的脚本,我用了一下发现还是缺少一些功能,遂决定站在巨人的肩膀上再小小的魔改一下。
我之前写的简陋脚本

使用方法是先将spine添加至系统环境变量,然后将脚本文件和spine导出设置文件一同放在需要导出的目录下(注意导出设置的文件名字一定是exportSettings.export.json),双击即可。

先看看spine自带的工具都需要什么才能帮助我导出文件
添加好环境变量后,使用Windows+R组合键打开运行,输入cmd打开命令行工具,在弹出的窗口中输入 spine -h

spine -h
大概的格式为spine -i “spine文件的路径” -o “导出的路径” -e“导出设置”
如上图所示参数 -i 代表input,即导入,这里可以是一个或多个.spine文件,亦可以是.json或者.atlas文件;参数 -o 代表output,即导出,这里是一个文件路径;参数 -e 代表导出设置,即spine保存的导出设置文件,扩展名为.export.json

不知道导出设置文件怎么来的看这里
所以如果要批量导出,除了spine的导出设置,我们还需要需要收集以下两个数据:
1.所有需要导出的文件
2.导出的目录
解析一下这个简陋版脚本:
为了方便解析,我们先假定一个使用场景:

如上图,现在有两个spine需要导出,分别为CCC和LLL,CCC文件夹的内容如图所示,LLL也是这样的,现在将脚本和导出设置文件拷贝到test文件夹内

@echo off这一行的意思是:关闭命令回显,这样cmd窗口中就不会出现脚本输入的命令。echo off的作用是关闭命令回显,使得在执行批处理文件时,命令本身不会被显示在命令行窗口或控制台上,而只有命令的执行结果被显示。此处@ 符号用于关闭紧跟其后的第一条命令的回显。
set inputDIR=%~dp0这一行的意思是:设定一个inputDIR的变量,变量的内容为当前脚本所在的目录。 set命令用于定义或修改环境变量,这里定义了一个名为inputDIR的变量。假设这个文件的完整目录为 D:\json\test\批量导出2.0.bat%0代表脚本文件自身,即 批量导出2.0.bat~dp的意思是变量扩充,“d”为Drive的缩写,即磁盘,“p”为Path的缩写,即路径。下面为示例:
@echo off
chcp 65001
echo 当前文件:%0
echo 当前盘符:%~d0
echo 当前路径:%~p0
echo 当前盘符和路径:%~dp0
pause

执行结果
if exist "%inputDIR%SpineExport" rmdir /s /q "%inputDIR%SpineExport"使用if exit判断变量inputDIR所指定的目录下有没有一个叫做SpineExport的文件夹,如果有,删除它,如果没有,执行下一行。我这样写是为了在重新运行脚本的时候,上一次导出的文件不会影响到这次的,所以选择删除掉之前导出的文件。我们在上一行定义了一个名为inputDIR的变量,这里使用两个%符号来引用他。rmdir 用于删除一个目录,参数/s 代表除目录本身外,还将删除指定目录下的所有子目录和文件,/q 的意思为安静模式,使用/s 删除时不需要确认。
@echo off
set inputDIR=%~dp0
echo %inputDIR%
pause

引用变量
mkdir "%inputDIR%SpineExport"在变量inputDIR所指定的目录下创建一个名为SpineExport的文件夹。mkdir 用于创建一个目录。
for /f ... do(...)这个句式的意思是:为 for /f 找到的每个文件执行命令。for 的用法:for 参数 %%变量名 in (匹配符) do (执行的命令)for /f 用来提取文本信息,即我要找的spine文件的名字。do 用来执行我设定的指令,此处有两个指令。
"delims=" %%i in ('dir /b/a-d/s %inputDIR%*.spine')delims=xxx 这个参数替换了空格和默制表符的默认分隔符集,这里= 符号后面什么都没填,代表不做分割,整行赋予给变量 i 。批处理脚本中使用了 空格 作为默认的分隔符,分隔符的作用是把一行文本分割为若干个部分,如果不用命令指定,默认会输出第一部分的内容而忽略分隔符后面的内容,所以如果文件名中有 空格 符号时,会影响 i 的值。
@echo off
set inputDIR=%~dp0
for /f "delims=" %%i in ('dir /b/a-d/s %inputDIR%*.spine') do (
echo %%i
) 这里我们把 i 的值打印出来看一下:

带有空格的第二个spine文件成功打印出来
如果删除上述代码中的 "delims=" 则会出现如下情况:

名字中带有空格的第二个spine文件无法完整打印出来,因为空格后面的内容被忽略了
%%i 在for 命令中,指定变量需要使用%%,而不是前文所述的set
dir /b/a-d/s 这条命令列出了指定的变量inputDIR中所指定的目录中的所有文件。
dir 命令用于列出指定的磁盘、目录和文件。参数/b 表示使用空格式,去掉输出的内容中的摘要和标题;/a-d 表示显示文件的目录;/s 表示显示指定目录和所有子目录中的文件。
*.spine 用于筛选出 .spine 文件

分别看一下这些dir命令的结果
mkdir "%inputDIR%SpineExport\%%~ni"这一行的意思是在SpineExport里面创建和找到的spine文件同名的文件夹前面我们获取了目录下所有spine文件的名字,并把它存在变量 i 中,此时 i 的内容为D:\json\test\CCC\CCC.spine,如果我想创建一个和spine文件同名的文件夹,并不能直接用 i 的内容去创建,需要在这一串文字中把CCC这三个字母提取出来,怎么提取呢,使用特殊指令来获取文件的特定信息,这里使用 %%~ni 来获取文件的名字,n代表name这里还有一些其他的特殊命令:%%~fi: 获取该文件的绝对路径信息%%~di: 获取该文件所在的盘符%%~pi: 获取该文件的路径,不包含盘符的信息%%~ni: 获取该文件的文件名,不包含扩展名信息%%~xi: 获取该文件的扩展名%%~ti: 获取该文件的上次修改时间%%~zi: 获取该文件的大小
Spine -i %%i -o "%inputDIR%SpineExport\%%~ni" -e "%inputDIR%exportSettings.export.json"到这里就是spine命令行工具的用法了,上面我们讲了大概的格式为:spine -i “spine文件的路径” -o “导出的路径” -e“导出设置”这里:文件路径 = %%i导出的路径 = %inputDIR%SpineExport\%%~ni导出设置 = %inputDIR%exportSettings.export.json结合前面的代码,直接把命令的内容打印出来:

pause暂停执行,等待用户按下任意键后继续