Windows 批处理文件:将结构转换为单行字符串
Windows Batch File : Convert Structures into Single Lines Strings
这个艰巨的任务我需要作为一个批处理文件来完成,它不是最难用 C 做的,但在 DOS 中是一个地狱(至少对我来说!)我需要将一个结构转换为一个单一的 var ( string) 以便能够在我的程序中再次将它们转换为该结构。不用担心卷土重来,已经搞定了
该结构的大小会有所不同,并且在 [0] 内有一个索引,它需要成为我的变量中的第一项。
这里是这些结构的一个例子(只有 3 个):
level.waypoints[0] = spawnstruct();
level.waypoints[0].origin = (1774.5,834.7,67.6);
level.waypoints[0].type = "stand";
level.waypoints[0].childCount = 2;
level.waypoints[0].children[0] = 1;
level.waypoints[0].children[1] = 6;
level.waypoints[1] = spawnstruct();
level.waypoints[1].origin = (1780.6,639.1,65.5);
level.waypoints[1].type = "stand";
level.waypoints[1].childCount = 2;
level.waypoints[1].children[0] = 7;
level.waypoints[1].children[1] = 0;
level.waypoints[2] = spawnstruct();
level.waypoints[2].origin = (1902.2,-345.2,74.2);
level.waypoints[2].type = "stand";
level.waypoints[2].childCount = 2;
level.waypoints[2].children[0] = 3;
level.waypoints[2].children[1] = 97;
level.waypoints[3] = spawnstruct();
level.waypoints[3].origin = ... (goes on...)
所以第一个结构:
level.waypoints[0] = spawnstruct();
level.waypoints[0].origin = (1774.5,834.7,67.6);
level.waypoints[0].type = "stand";
level.waypoints[0].childCount = 2;
level.waypoints[0].children[0] = 1;
level.waypoints[0].children[1] = 6;
我需要将这个结构转换成这一行:
set flwp_0 "0,1774.5,834.7,67.6,stand,2,1,6"
其中 0 (flwp_) 是索引,也是 "" 中的第一项。
所以这个例子中的另外两个是:
set flwp_1 "1,1780.6,639.1,65.5,3,7,0,30"
set flwp_2 "2,1902.2,-345.2,74.2,2,3,97"
childCount 可以是任何值,但我认为不会超过 9。
所以,我们有多少个 childCount,更多 children 将在下一行。
但我只需要 childCount 值之后的值,所以我根据该值知道该字符串中还有多少项目可用,所以没问题。
我正在考虑首先删除我不需要的所有内容,例如(按顺序):
level.waypoints[
] = spawnstruct();
].origin = (
);
].type = "
";
].childCount =
].children[0] =
].children[1] =
].children[2] =
].children[3] =
].children[4] =
].children[5] =
].children[6] =
].children[7] =
].children[8] =
].children[9] =
;
这将在第一个结构中留下类似的内容:
0
01774.5,834.7,67.6
0stand
02
01
06
现在我需要阅读它并将其转换为我的单行字符串。但我无法知道正确的索引,因为它可能是第一个值,但如果索引有 2 个或 3 个字符?
我也想用一些信息替换来跟踪我,所以不会替换文件的“]”,所以我会知道前面是索引,后面是值。
我也曾尝试循环但没有成功创建索引,例如:
level.waypoints[X]
其中 X 是从 0 到 1000(我不相信会传递那个数字)
这行不通,也许我的第一个想法更好...:\
我需要一个(或多个)批处理文件来将几个具有类似结构的文件转换为新文件,并将值作为我在上面详细写的字符串。
有什么想法吗?
谢谢!
@Squashman 正如您所见,结果的顺序也有点混乱:
set flwp_0 "0,1774.5,834.7,67.6,stand,2,1,6"
set flwp_100 "100,1636.76,371.924,240.125,stand,2,101,99"
set flwp_101 "101,1861.45,437.846,240.125,stand,2,102,100"
set flwp_102 "102,1843.93,557.03,240.125,stand,2,103,101"
set flwp_103 "103,1504.58,553.357,64.125,stand,2,8,102"
set flwp_104 "104,653.17,1675.32,64.125,stand,2,26,105"
set flwp_105 "105,338.784,1680.49,232.125,stand,2,104,133"
set flwp_106 "106,-919.398,1537.7,80.125,stand,3,107,109,150"
set flwp_107 "107,-928.311,1111.47,80.125,stand,3,108,106,149"
set flwp_108 "108,-696.488,1095.93,80.125,stand,2,36,107"
set flwp_109 "109,-787.781,1566.87,80.125,stand,2,106,110"
set flwp_10 "10,1423.3,-403.8,64.3,stand,4,11,12,15,3"
set flwp_110 "110,-754.274,1716.71,80.125,stand,2,109,34"
set flwp_111 "111,-736.201,1887.87,64.125,stand,4,112,34,151,152"
set flwp_112 "112,-454.293,1879.4,64.125,stand,4,111,33,34,152"
set flwp_113 "113,125.395,-451.579,58.6958,stand,3,51,114,142"
set flwp_114 "114,282.593,-447.87,68.125,stand,2,115,113"
set flwp_115 "115,304.311,-271.206,68.125,stand,2,116,114"
set flwp_116 "116,447.128,-292.167,68.125,stand,3,118,115,117"
set flwp_117 "117,437.415,-443.822,68.125,stand,2,67,116"
set flwp_118 "118,582.932,-297.811,126.125,stand,2,119,116"
set flwp_119 "119,561.586,-485.701,204.125,stand,2,120,118"
set flwp_11 "11,1240.1,-249.7,74.1,stand,5,9,16,10,12,15"
set flwp_120 "120,423.422,-470.754,204.125,stand,2,119,135"
set flwp_121 "121,1164.82,-1203.64,72.125,stand,4,123,14,126,122"
set flwp_122 "122,1064.12,-1299.76,72.125,stand,3,123,125,121"
set flwp_123 "123,1117.59,-1476.49,72.125,stand,3,124,122,121"
set flwp_124 "124,861.878,-1497.7,72.125,stand,2,125,123"
set flwp_125 "125,878.58,-1294.38,72.125,stand,2,124,122"
是否可以按正确的顺序写入文件?
再次感谢@Squashman 的帮助
干杯
好的,顺序确实无关紧要,但我很难将每个文件都变成一个新文件...我试过了但没有成功:
@echo off
setlocal enabledelayedexpansion
for %%f in (*.gsc) do (
FOR /F "tokens=1-2 delims==;^(^) " %%G IN (%%f) do set %%~G=%%~H
FOR /F "tokens=2 delims=[]" %%G IN ('set level.waypoints ^|find /I "spawnstruct"') do (
SET waypoints=!waypoints! %%G
)
FOR %%G IN (%waypoints%) do (
set line=%%G,!level.waypoints[%%G].origin!,!level.waypoints[%%G].type!,!level.waypoints[%%G].childCount!
FOR /F "tokens=2 delims==" %%H IN ('set level.waypoints[%%G].children') DO set line=!line!,%%H
set line=set flwp_%%G "!line!"
echo !line! >> %%f.cfg
)
)
pause
有什么线索吗?
=======================================
好的,现在我们非常接近了!只需要处理带有 level.waypoints[
的行,其余的必须忽略,并且还要添加一个我已经在下面成功完成的最终关闭变量:
@echo off
setlocal enableDelayedExpansion
set findtext="level.waypoints["
for %%F in (*.gsc) do (
set "out="
set "i=x"
> "%%~nF.cfg" (
for /f usebackq^ tokens^=2^,4^,5^ delims^=[]^=(^)^;^"^ %%A in ("%%F") do (
if %%A neq !i! (
if defined out echo !out!"
set /a "i=%%A, j=0"
set "out=set flwp_!i! "!i!"
) else (
set /a j+=1
if !j! leq 3 (set "out=!out!,%%B") else set "out=!out!,%%C"
)
)
if defined out echo !out!"
set /a "fim=i+1"
echo set flwp_!fim! "eof"
)
)
现在如何将 findstr %findtext%
添加到这些循环中?我尝试了很多不同的方法,但语法错误......你能帮我吗? :D
非常感谢@Squashman 和@dbenham 到目前为止的所有帮助。
干杯
根据您的新请求编辑了代码。
@echo off
FOR %%F IN (*.gsc) DO (
setlocal enabledelayedexpansion
FOR /F "usebackq tokens=1-2 delims==;^(^) " %%G IN (`find /I "level.waypoints["^<"%%F"`) do set %%~G=%%~H
(FOR /F "tokens=2 delims=[]" %%G IN ('find /I "spawnstruct" ^<"%%F"') do (
set line=%%G,!level.waypoints[%%G].origin!,!level.waypoints[%%G].type!,!level.waypoints[%%G].childCount!
FOR /F "tokens=2 delims==" %%H IN ('set level.waypoints[%%G].children') DO set line=!line!,%%H
set line=set flwp_%%G "!line!"
echo !line!
))>"%%~nF.cfg"
endlocal
)
pause
这是一个相对快速的纯批处理解决方案,它对每个文件使用单个 FOR /F 循环。它明显快于 .
我设置 DELIMS 和 TOKENS 来解析所有需要的数据元素,无论我正在解析哪一行。我不担心 childCount 的值。相反,我只是检测航点索引的变化以表示新记录的开始,并使用递增的航点行号(j
变量)来识别每行需要哪些标记。每行向 out 变量添加新文本。
@echo off
setlocal enableDelayedExpansion
for %%F in (*.gsc) do (
set "out="
set "i=x"
> "%%~nF.cfg" (
for /f usebackq^ tokens^=2^,4^,5^ delims^=[]^=(^)^;^"^ %%A in ("%%F") do (
if %%A neq !i! (
if defined out echo !out!"
set /a "i=%%A, j=0"
set "out=set flwp_!i! "!i!"
) else (
set /a j+=1
if !j! leq 3 (set "out=!out!,%%B") else set "out=!out!,%%C"
)
)
if defined out echo !out!"
)
)
以上能够在 70 秒内在我的机器上处理一个 23 MB 的文件。
但如果你允许自己超出纯批处理的范围,我可以做得更好。这是一个有效的 JREPL.BAT 解决方案,它利用了刚刚发布的新版本 6.0 功能。
JREPL.BAT is a regular expression text processing utility for Windows。它是纯脚本(混合 batch/Jscript),可在 XP 及更高版本的任何 Windows 机器上本地运行。不需要第 3 方 exe 文件。
通过 jrepl /?
或 jrepl /??
获取分页帮助可从命令行获得大量文档。
此解决方案应该能够处理大小接近 1 GB 的文件。每个文件都通过一次调用 JREPL.BAT 来完全处理。它应该非常有效,因为需要的回溯最少。对于小文件,由于 CSCRIPT 引擎的启动时间,它会比纯批处理方法慢。但是对于大文件,它比纯批处理要快得多。
下面的代码在 11 秒内处理同一个 23 MB 的文件:-)
第一个版本将复杂的正则表达式术语的构造分解为多个步骤,并在每个捕获的组上方包含注释数字,让您有机会了解其工作原理。特别是阅读 /T 和 /P 选项的文档。还要加强您的正则表达式技能!
@echo off
setlocal
set "filter=(.*?\[\d+])[\s\S]*?(?:\n(?!)|(?![\s\S]))"
:: 1 2 3 4
set "find1=l.*?\[(\d+)\][\s\S]*?\((\d.*?)\)[\s\S]*?\q(.*?)\q"
set "repl1=set flwp_ \q,,"
:: 5 6
set "find2=;[\s\S]*? = (\d+)"
set "repl2=,"
:: 7
set "find3=[\s\S]+"
set "repl3=\q\n"
set "find=%find1%|%find2%|%find3%"
set "repl=%repl1%|%repl2%|%repl3%"
for %%F in (*.gsc) do (
call jrepl.bat "%find%" "%repl%" /t "|" /p "%filter%" /x /m /f "%%F" /o "%%~nF.cfg"
)
这里是完全相同的解决方案,但没有显示任何中间步骤。我确实包含了行延续以提高可读性。
@echo off
for %%F in (*.gsc) do (
call jrepl.bat "l.*?\[(\d+)\][\s\S]*?\((\d.*?)\)[\s\S]*?\q(.*?)\q|;[\s\S]*? = (\d+)|[\s\S]+"^
"set flwp_ \q,,|,|\q\n"^
/p "(.*?\[\d+])[\s\S]*?(?:\n(?!)|(?![\s\S]))"^
/t "|" /x /m /f "%%F" /o "%%~nF.cfg"
)
我认为最快的脚本解决方案是自定义构建的 JScript 或 VBS 脚本。但我喜欢使用 JREPL :-)
更新:这里有一个小奖励 - 一个 JREPL 脚本,可以将 *.cfg 转换回 *.gsc
@echo off
setlocal
set "beg=var pre,i,q='\x22',n='\r\n'"
:: 1 2 3 4 5 67
set "find=^.*?\q(\d+),(.*?,.*?,.*?),(.*?),(.*?),|(.*?)[,\q]"
set "repl=i=0;pre='level.waypoints['++']';$txt=pre+' = spawnstruct();'"
set "repl=%repl%+n+pre+'.origin = ('++');'"
set "repl=%repl%+n+pre+'.type = '+q++q+';'"
set "repl=%repl%+n+pre+'.childCount = '++';'"
set "repl=%repl%|$txt=n+pre+'.children['+(i++)+'] = '++';'"
for %%F in (*.cfg) do (
call jrepl.bat "%find%" "%repl%" /x /t "|" /jq /jbeg "%beg%" /f "%%F" /o "%%~nF.gsc"
)
这个艰巨的任务我需要作为一个批处理文件来完成,它不是最难用 C 做的,但在 DOS 中是一个地狱(至少对我来说!)我需要将一个结构转换为一个单一的 var ( string) 以便能够在我的程序中再次将它们转换为该结构。不用担心卷土重来,已经搞定了
该结构的大小会有所不同,并且在 [0] 内有一个索引,它需要成为我的变量中的第一项。
这里是这些结构的一个例子(只有 3 个):
level.waypoints[0] = spawnstruct();
level.waypoints[0].origin = (1774.5,834.7,67.6);
level.waypoints[0].type = "stand";
level.waypoints[0].childCount = 2;
level.waypoints[0].children[0] = 1;
level.waypoints[0].children[1] = 6;
level.waypoints[1] = spawnstruct();
level.waypoints[1].origin = (1780.6,639.1,65.5);
level.waypoints[1].type = "stand";
level.waypoints[1].childCount = 2;
level.waypoints[1].children[0] = 7;
level.waypoints[1].children[1] = 0;
level.waypoints[2] = spawnstruct();
level.waypoints[2].origin = (1902.2,-345.2,74.2);
level.waypoints[2].type = "stand";
level.waypoints[2].childCount = 2;
level.waypoints[2].children[0] = 3;
level.waypoints[2].children[1] = 97;
level.waypoints[3] = spawnstruct();
level.waypoints[3].origin = ... (goes on...)
所以第一个结构:
level.waypoints[0] = spawnstruct();
level.waypoints[0].origin = (1774.5,834.7,67.6);
level.waypoints[0].type = "stand";
level.waypoints[0].childCount = 2;
level.waypoints[0].children[0] = 1;
level.waypoints[0].children[1] = 6;
我需要将这个结构转换成这一行:
set flwp_0 "0,1774.5,834.7,67.6,stand,2,1,6"
其中 0 (flwp_) 是索引,也是 "" 中的第一项。
所以这个例子中的另外两个是:
set flwp_1 "1,1780.6,639.1,65.5,3,7,0,30"
set flwp_2 "2,1902.2,-345.2,74.2,2,3,97"
childCount 可以是任何值,但我认为不会超过 9。 所以,我们有多少个 childCount,更多 children 将在下一行。
但我只需要 childCount 值之后的值,所以我根据该值知道该字符串中还有多少项目可用,所以没问题。
我正在考虑首先删除我不需要的所有内容,例如(按顺序):
level.waypoints[
] = spawnstruct();
].origin = (
);
].type = "
";
].childCount =
].children[0] =
].children[1] =
].children[2] =
].children[3] =
].children[4] =
].children[5] =
].children[6] =
].children[7] =
].children[8] =
].children[9] =
;
这将在第一个结构中留下类似的内容:
0
01774.5,834.7,67.6
0stand
02
01
06
现在我需要阅读它并将其转换为我的单行字符串。但我无法知道正确的索引,因为它可能是第一个值,但如果索引有 2 个或 3 个字符?
我也想用一些信息替换来跟踪我,所以不会替换文件的“]”,所以我会知道前面是索引,后面是值。
我也曾尝试循环但没有成功创建索引,例如:
level.waypoints[X]
其中 X 是从 0 到 1000(我不相信会传递那个数字)
这行不通,也许我的第一个想法更好...:\
我需要一个(或多个)批处理文件来将几个具有类似结构的文件转换为新文件,并将值作为我在上面详细写的字符串。
有什么想法吗?
谢谢!
@Squashman 正如您所见,结果的顺序也有点混乱:
set flwp_0 "0,1774.5,834.7,67.6,stand,2,1,6"
set flwp_100 "100,1636.76,371.924,240.125,stand,2,101,99"
set flwp_101 "101,1861.45,437.846,240.125,stand,2,102,100"
set flwp_102 "102,1843.93,557.03,240.125,stand,2,103,101"
set flwp_103 "103,1504.58,553.357,64.125,stand,2,8,102"
set flwp_104 "104,653.17,1675.32,64.125,stand,2,26,105"
set flwp_105 "105,338.784,1680.49,232.125,stand,2,104,133"
set flwp_106 "106,-919.398,1537.7,80.125,stand,3,107,109,150"
set flwp_107 "107,-928.311,1111.47,80.125,stand,3,108,106,149"
set flwp_108 "108,-696.488,1095.93,80.125,stand,2,36,107"
set flwp_109 "109,-787.781,1566.87,80.125,stand,2,106,110"
set flwp_10 "10,1423.3,-403.8,64.3,stand,4,11,12,15,3"
set flwp_110 "110,-754.274,1716.71,80.125,stand,2,109,34"
set flwp_111 "111,-736.201,1887.87,64.125,stand,4,112,34,151,152"
set flwp_112 "112,-454.293,1879.4,64.125,stand,4,111,33,34,152"
set flwp_113 "113,125.395,-451.579,58.6958,stand,3,51,114,142"
set flwp_114 "114,282.593,-447.87,68.125,stand,2,115,113"
set flwp_115 "115,304.311,-271.206,68.125,stand,2,116,114"
set flwp_116 "116,447.128,-292.167,68.125,stand,3,118,115,117"
set flwp_117 "117,437.415,-443.822,68.125,stand,2,67,116"
set flwp_118 "118,582.932,-297.811,126.125,stand,2,119,116"
set flwp_119 "119,561.586,-485.701,204.125,stand,2,120,118"
set flwp_11 "11,1240.1,-249.7,74.1,stand,5,9,16,10,12,15"
set flwp_120 "120,423.422,-470.754,204.125,stand,2,119,135"
set flwp_121 "121,1164.82,-1203.64,72.125,stand,4,123,14,126,122"
set flwp_122 "122,1064.12,-1299.76,72.125,stand,3,123,125,121"
set flwp_123 "123,1117.59,-1476.49,72.125,stand,3,124,122,121"
set flwp_124 "124,861.878,-1497.7,72.125,stand,2,125,123"
set flwp_125 "125,878.58,-1294.38,72.125,stand,2,124,122"
是否可以按正确的顺序写入文件?
再次感谢@Squashman 的帮助
干杯
好的,顺序确实无关紧要,但我很难将每个文件都变成一个新文件...我试过了但没有成功:
@echo off
setlocal enabledelayedexpansion
for %%f in (*.gsc) do (
FOR /F "tokens=1-2 delims==;^(^) " %%G IN (%%f) do set %%~G=%%~H
FOR /F "tokens=2 delims=[]" %%G IN ('set level.waypoints ^|find /I "spawnstruct"') do (
SET waypoints=!waypoints! %%G
)
FOR %%G IN (%waypoints%) do (
set line=%%G,!level.waypoints[%%G].origin!,!level.waypoints[%%G].type!,!level.waypoints[%%G].childCount!
FOR /F "tokens=2 delims==" %%H IN ('set level.waypoints[%%G].children') DO set line=!line!,%%H
set line=set flwp_%%G "!line!"
echo !line! >> %%f.cfg
)
)
pause
有什么线索吗?
=======================================
好的,现在我们非常接近了!只需要处理带有 level.waypoints[
的行,其余的必须忽略,并且还要添加一个我已经在下面成功完成的最终关闭变量:
@echo off
setlocal enableDelayedExpansion
set findtext="level.waypoints["
for %%F in (*.gsc) do (
set "out="
set "i=x"
> "%%~nF.cfg" (
for /f usebackq^ tokens^=2^,4^,5^ delims^=[]^=(^)^;^"^ %%A in ("%%F") do (
if %%A neq !i! (
if defined out echo !out!"
set /a "i=%%A, j=0"
set "out=set flwp_!i! "!i!"
) else (
set /a j+=1
if !j! leq 3 (set "out=!out!,%%B") else set "out=!out!,%%C"
)
)
if defined out echo !out!"
set /a "fim=i+1"
echo set flwp_!fim! "eof"
)
)
现在如何将 findstr %findtext%
添加到这些循环中?我尝试了很多不同的方法,但语法错误......你能帮我吗? :D
非常感谢@Squashman 和@dbenham 到目前为止的所有帮助。
干杯
根据您的新请求编辑了代码。
@echo off
FOR %%F IN (*.gsc) DO (
setlocal enabledelayedexpansion
FOR /F "usebackq tokens=1-2 delims==;^(^) " %%G IN (`find /I "level.waypoints["^<"%%F"`) do set %%~G=%%~H
(FOR /F "tokens=2 delims=[]" %%G IN ('find /I "spawnstruct" ^<"%%F"') do (
set line=%%G,!level.waypoints[%%G].origin!,!level.waypoints[%%G].type!,!level.waypoints[%%G].childCount!
FOR /F "tokens=2 delims==" %%H IN ('set level.waypoints[%%G].children') DO set line=!line!,%%H
set line=set flwp_%%G "!line!"
echo !line!
))>"%%~nF.cfg"
endlocal
)
pause
这是一个相对快速的纯批处理解决方案,它对每个文件使用单个 FOR /F 循环。它明显快于
我设置 DELIMS 和 TOKENS 来解析所有需要的数据元素,无论我正在解析哪一行。我不担心 childCount 的值。相反,我只是检测航点索引的变化以表示新记录的开始,并使用递增的航点行号(j
变量)来识别每行需要哪些标记。每行向 out 变量添加新文本。
@echo off
setlocal enableDelayedExpansion
for %%F in (*.gsc) do (
set "out="
set "i=x"
> "%%~nF.cfg" (
for /f usebackq^ tokens^=2^,4^,5^ delims^=[]^=(^)^;^"^ %%A in ("%%F") do (
if %%A neq !i! (
if defined out echo !out!"
set /a "i=%%A, j=0"
set "out=set flwp_!i! "!i!"
) else (
set /a j+=1
if !j! leq 3 (set "out=!out!,%%B") else set "out=!out!,%%C"
)
)
if defined out echo !out!"
)
)
以上能够在 70 秒内在我的机器上处理一个 23 MB 的文件。
但如果你允许自己超出纯批处理的范围,我可以做得更好。这是一个有效的 JREPL.BAT 解决方案,它利用了刚刚发布的新版本 6.0 功能。
JREPL.BAT is a regular expression text processing utility for Windows。它是纯脚本(混合 batch/Jscript),可在 XP 及更高版本的任何 Windows 机器上本地运行。不需要第 3 方 exe 文件。
通过 jrepl /?
或 jrepl /??
获取分页帮助可从命令行获得大量文档。
此解决方案应该能够处理大小接近 1 GB 的文件。每个文件都通过一次调用 JREPL.BAT 来完全处理。它应该非常有效,因为需要的回溯最少。对于小文件,由于 CSCRIPT 引擎的启动时间,它会比纯批处理方法慢。但是对于大文件,它比纯批处理要快得多。
下面的代码在 11 秒内处理同一个 23 MB 的文件:-)
第一个版本将复杂的正则表达式术语的构造分解为多个步骤,并在每个捕获的组上方包含注释数字,让您有机会了解其工作原理。特别是阅读 /T 和 /P 选项的文档。还要加强您的正则表达式技能!
@echo off
setlocal
set "filter=(.*?\[\d+])[\s\S]*?(?:\n(?!)|(?![\s\S]))"
:: 1 2 3 4
set "find1=l.*?\[(\d+)\][\s\S]*?\((\d.*?)\)[\s\S]*?\q(.*?)\q"
set "repl1=set flwp_ \q,,"
:: 5 6
set "find2=;[\s\S]*? = (\d+)"
set "repl2=,"
:: 7
set "find3=[\s\S]+"
set "repl3=\q\n"
set "find=%find1%|%find2%|%find3%"
set "repl=%repl1%|%repl2%|%repl3%"
for %%F in (*.gsc) do (
call jrepl.bat "%find%" "%repl%" /t "|" /p "%filter%" /x /m /f "%%F" /o "%%~nF.cfg"
)
这里是完全相同的解决方案,但没有显示任何中间步骤。我确实包含了行延续以提高可读性。
@echo off
for %%F in (*.gsc) do (
call jrepl.bat "l.*?\[(\d+)\][\s\S]*?\((\d.*?)\)[\s\S]*?\q(.*?)\q|;[\s\S]*? = (\d+)|[\s\S]+"^
"set flwp_ \q,,|,|\q\n"^
/p "(.*?\[\d+])[\s\S]*?(?:\n(?!)|(?![\s\S]))"^
/t "|" /x /m /f "%%F" /o "%%~nF.cfg"
)
我认为最快的脚本解决方案是自定义构建的 JScript 或 VBS 脚本。但我喜欢使用 JREPL :-)
更新:这里有一个小奖励 - 一个 JREPL 脚本,可以将 *.cfg 转换回 *.gsc
@echo off
setlocal
set "beg=var pre,i,q='\x22',n='\r\n'"
:: 1 2 3 4 5 67
set "find=^.*?\q(\d+),(.*?,.*?,.*?),(.*?),(.*?),|(.*?)[,\q]"
set "repl=i=0;pre='level.waypoints['++']';$txt=pre+' = spawnstruct();'"
set "repl=%repl%+n+pre+'.origin = ('++');'"
set "repl=%repl%+n+pre+'.type = '+q++q+';'"
set "repl=%repl%+n+pre+'.childCount = '++';'"
set "repl=%repl%|$txt=n+pre+'.children['+(i++)+'] = '++';'"
for %%F in (*.cfg) do (
call jrepl.bat "%find%" "%repl%" /x /t "|" /jq /jbeg "%beg%" /f "%%F" /o "%%~nF.gsc"
)