@echo off
setlocal enabledelayedexpansion
@REM 获取当前目录(根目录)
set "rootFolder=%cd%"
set "outputFolder=%cd%"
set "outputName=HK"
set "osgconvPath=D:\software\OpenSceneGraph-3.6.5-VC2022-64-Release-2023-01\bin\osgconv.exe"
set "osgconvOptions=-O OutputTextureFiles"
set "levels=;"
set "osgbFileObjects="
set /a osgbFileObjectsIndex=0
echo 提取层级...
@REM 遍历当前目录(根目录)下所有切片文件夹
for /d %%A in ("%rootFolder%\*") do (
set "tileFolderPath=%%A"
@REM 取出子文件夹名称(不含路径)
set "tileFolderName=%%~nxA"
@REM 计算文件夹名称的长度
call :strlen tileFolderName tileFolderNameLen
@REM echo 处理切片文件夹: !tileFolderPath! ...
@REM echo 切片文件夹名称: !tileFolderName!
@REM echo 切片文件夹名称长度:!tileFolderNameLen!
@REM 遍历当前切片文件夹中的所有 .osgb 文件
for %%B in ("!tileFolderPath!\*.osgb") do (
set "osgbFilePath=%%B"
set "osgbFileName=%%~nxB"
call :strlen osgbFileName osgbFileNameLen
set /a minLen=!tileFolderNameLen!+5
set /a levelStartIndex=!tileFolderNameLen!+2
if !osgbFileNameLen! GEQ !minLen! (
call set "osgbFileNamePrefix=%%osgbFileName:~0,!tileFolderNameLen!%%"
set "rootOsgbFileName=!tileFolderName!.osgb"
if /I "!osgbFileName!"=="!rootOsgbFileName!" (
@REM 根文件
@REM echo 根文件:!osgbFileName!
) ^
else if /I "!osgbFileNamePrefix!"=="!tileFolderName!" (
call set "levelPrefix=%%osgbFileName:~!tileFolderNameLen!,2%%"
if /I "!levelPrefix!"=="_L" (
call set "level=%%osgbFileName:~!levelStartIndex!,2%%"
set "osgbFileObjects[!osgbFileObjectsIndex!].level=!level!"
set "osgbFileObjects[!osgbFileObjectsIndex!].path=!tileFolderName!\!osgbFileName!"
set /a osgbFileObjectsIndex+=1
@REM echo 层级:!level!
@REM 检查元素是否存在(不区分大小写)
echo !levels! | find /i ";!level!;" >nul
if errorlevel 1 (
set "levels=!levels!!level!;"
@REM echo [成功] 添加: !level!
) else (
@REM echo [跳过] 已存在: !level!
)
)
)
)
)
@REM echo 所有文件名称:
@REM for /L %%B in (1,1,!osgbFileNamesIndex!) do (
@REM echo !osgbFileNames[%%B]!
@REM )
)
set /a osgbFileObjectsIndex-=1
set "levels=%levels:~1,-1%"
set "levels=%levels:;= %"
echo 所有层级: %levels%
@REM for /L %%A in (0,1,!osgbFileObjectsIndex!) do (
@REM set "level=!osgbFileObjects[%%A].level!"
@REM set "path=!osgbFileObjects[%%A].path!"
@REM echo 层级:!level! 路径:!path!
@REM )
call :strlen osgconvPath osgconvPathLen
call :strlen osgconvOptions osgconvOptionsLen
call :strlen outputFolder outputFolderLen
call :strlen outputName outputNameLen
set /a baseCmdLen=!osgconvPathLen!+!osgconvOptionsLen!+!outputFolderLen!+!outputNameLen!+9
@REM echo 基础命令长度:!baseCmdLen!
set /a osgbFileParamsMaxLen=8000-!baseCmdLen!
echo 参数最大长度:!osgbFileParamsMaxLen!
for %%A in (%levels%) do (
set "level=%%A"
echo 处理层级:!level! ...
set "osgbFileParams="
set /a osgbFileParamsLen=0
set /a splitSuffix=1
for /L %%B in (0,1,!osgbFileObjectsIndex!) do (
if /I "!osgbFileObjects[%%B].level!"=="!level!" (
set "osgbFilePath=!osgbFileObjects[%%B].path!"
call :strlen osgbFilePath osgbFilePathLen
set /a mergeLen=!osgbFileParamsLen!+!osgbFilePathLen!
if !mergeLen! LEQ !osgbFileParamsMaxLen! (
set "osgbFileParams=!osgbFileParams! !osgbFilePath!"
set /a osgbFileParamsLen+=!osgbFilePathLen!
) else (
echo 分批执行 - !splitSuffix!:
set "cmdText=!osgconvPath! !osgconvOptions!!osgbFileParams! !outputFolder!\!outputName!_L!level!_!splitSuffix!.obj"
@REM echo !cmdText!
call !cmdText!
echo 分批 - !splitSuffix! 执行完成!
set "osgbFileParams="
set /a osgbFileParamsLen=0
set /a splitSuffix+=1
)
)
)
if !osgbFileParamsLen! GTR 0 (
if !splitSuffix!==1 (
echo 执行:
set "cmdText=!osgconvPath! !osgconvOptions!!osgbFileParams! !outputFolder!\!outputName!_L!level!.obj"
@REM echo !cmdText!
call !cmdText!
echo 执行完成!
) else (
echo 分批执行 - !splitSuffix!:
set "cmdText=!osgconvPath! !osgconvOptions!!osgbFileParams! !outputFolder!\!outputName!_L!level!_!splitSuffix!.obj"
@REM echo !cmdText!
call !cmdText!
echo 分批 - !splitSuffix! 执行完成!
)
)
)
pause
goto :EOF
:strlen
rem 用于计算传入字符串的长度
rem 参数1:变量名(包含字符串) 参数2:输出变量名(存放长度)
setlocal enabledelayedexpansion
set "s=!%1!"
set "len=0"
:strlen_loop
if defined s (
set "s=!s:~1!"
set /a len+=1
goto strlen_loop
)
endlocal & set "%2=%len%"
goto :EOF
提取层级...
所有层级: 12 13 14 15 16 17 18 19 20 21 22
参数最大长度:7864
处理层级:12 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L12.obj'.
执行完成!
处理层级:13 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L13.obj'.
执行完成!
处理层级:14 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L14.obj'.
执行完成!
处理层级:15 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L15.obj'.
执行完成!
处理层级:16 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L16.obj'.
执行完成!
处理层级:17 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L17.obj'.
执行完成!
处理层级:18 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L18.obj'.
执行完成!
处理层级:19 ...
分批执行 - 1:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L19_1.obj'.
分批 - 1 执行完成!
分批执行 - 2:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L19_2.obj'.
分批 - 2 执行完成!
处理层级:20 ...
分批执行 - 1:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_1.obj'.
分批 - 1 执行完成!
分批执行 - 2:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_2.obj'.
分批 - 2 执行完成!
分批执行 - 3:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_3.obj'.
分批 - 3 执行完成!
分批执行 - 4:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_4.obj'.
分批 - 4 执行完成!
分批执行 - 5:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_5.obj'.
分批 - 5 执行完成!
分批执行 - 6:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_6.obj'.
分批 - 6 执行完成!
分批执行 - 7:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L20_7.obj'.
分批 - 7 执行完成!
处理层级:21 ...
分批执行 - 1:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_1.obj'.
分批 - 1 执行完成!
分批执行 - 2:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_2.obj'.
分批 - 2 执行完成!
分批执行 - 3:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_3.obj'.
分批 - 3 执行完成!
分批执行 - 4:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_4.obj'.
分批 - 4 执行完成!
分批执行 - 5:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_5.obj'.
分批 - 5 执行完成!
分批执行 - 6:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_6.obj'.
分批 - 6 执行完成!
分批执行 - 7:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_7.obj'.
分批 - 7 执行完成!
分批执行 - 8:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_8.obj'.
分批 - 8 执行完成!
处理层级:22 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L22.obj'.
执行完成!
请按任意键继续. . .
\TestData\osgb\osgb2obj\HK_L21_7.obj'.
分批 - 7 执行完成!
分批执行 - 8:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L21_8.obj'.
分批 - 8 执行完成!
处理层级:22 ...
执行:
Data written to 'D:\data\TestData\osgb\osgb2obj\HK_L22.obj'.
执行完成!
请按任意键继续. . .
```=