JSX脚本批量缩放SVG时Adobe Illustrator崩溃及磁盘占用异常求助
排查Adobe Illustrator批量SVG缩放脚本崩溃与磁盘占用问题
问题概述
使用JSX脚本批量缩放SVG文件时,出现以下异常:
- Illustrator频繁崩溃
- 磁盘占用剧增但无法定位具体占用位置
- 脚本仅能处理第一个文件,弹出缩放因子提示后停止运行
原始脚本
var ziel44 = 124.72; // 单位:pt var ziel88 = 249.45; // 单位:pt var speicherPfad = "C:/Users/daso/Source/" var folderPrefix = "C:/Users/daso/Target/" var inputFolder = Folder.selectDialog(speicherPfad); var files = inputFolder.getFiles("*.svg"); for (var i = 0; i < files.length; i++) { var file = new File(files[i]); try { var doc = app.open(file); doc.selection = null; doc.selection = doc.pageItems; app.executeMenuCommand('group'); // 将选中对象分组 var group = doc.selection[0]; var artboard = doc.artboards[0]; var rect = artboard.artboardRect; // 格式:[y1, x1, y2, x2] var width = Math.abs(rect[2] - rect[0]); var height = Math.abs(rect[1] - rect[3]); var scaleFactor = 1; if (height > width) { if (height < 40) { if (group.height > 0) { scaleFactor = (ziel44 / group.height) * 100; } } else { if (group.height > 0) { scaleFactor = (ziel88 / group.height) * 100; } } } else { if (width < 40) { if (group.width > 0) { scaleFactor = (ziel44 / group.width) * 100; } } else { if (group.width > 0) { scaleFactor = (ziel88 / group.width) * 100; } } } alert("Skalierungsfaktor: " + scaleFactor); group.resize(scaleFactor, scaleFactor); app.executeMenuCommand('ungroup'); app.executeMenuCommand('fitArtboardToSelectedArt'); var saveFile = new File(speicherPfad + "/" + file.name); var saveOptions = new IllustratorSaveOptions(); saveOptions.compatibility = Compatibility.ILLUSTRATOR29; saveOptions.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE; doc.exportFile(saveFile, ExportType.SVG, new ExportOptionsSVG()); doc.close(saveOptions.DONOTSAVECHANGES); $.sleep(1000); } catch (e) { alert("Fehler bei Datei: " + file.name + "\n" + e.message); if (doc && !doc.closed) { doc.close(SaveOptions.DONOTSAVECHANGES); } } }
排查与修复思路
1. 解决脚本执行中断问题
- 移除阻塞式弹窗:
alert("Skalierungsfaktor: " + scaleFactor)会强制暂停脚本,必须手动关闭才能继续执行,这是脚本仅处理第一个文件的直接原因。替换为日志输出:
可通过Illustrator菜单「窗口 > 信息 > 脚本日志」查看输出内容。$.writeln("文件" + file.name + "的缩放因子:" + scaleFactor); - 修正文档关闭参数错误:
doc.close(saveOptions.DONOTSAVECHANGES)应为doc.close(SaveOptions.DONOTSAVECHANGES),SaveOptions是全局枚举,不能通过saveOptions对象调用。
2. 解决Illustrator崩溃问题
- 替换不稳定的菜单命令:
app.executeMenuCommand依赖UI状态,易引发崩溃,改用原生API替代:- 分组操作:
var group = doc.groupItems.add(); doc.pageItems.everyItem().moveToEnd(group); - 取消分组:
group.ungroup(); - 适配画板:
artboard.fitToSelectedArt();
- 分组操作:
- 禁用UI交互与刷新:脚本执行前添加以下代码,减少UI渲染开销:
脚本结束后恢复原设置:var originalInteraction = app.userInteractionLevel; app.userInteractionLevel = UserInteractionLevel.DONTDISPLAYALERTS;app.userInteractionLevel = originalInteraction;
3. 解决磁盘占用异常问题
- 分离输入输出路径:当前脚本将导出文件覆盖到原目录,易产生冗余缓存。改用
folderPrefix作为输出目录:var saveFile = new File(folderPrefix + "/" + file.name); - 清理临时文件:Illustrator临时文件默认存储在
C:\Users\<用户名>\AppData\Local\Temp,脚本运行中若未正确关闭文档,临时文件可能无法自动删除。可手动清理该目录,或在脚本异常分支中强制关闭所有未关闭文档。 - 优化SVG导出选项:配置导出参数减少文件大小与冗余数据:
var svgOptions = new ExportOptionsSVG(); svgOptions.embedRasterImages = true; svgOptions.outputFormat = SVGOutputFormat.SVG_TINY; svgOptions.preserveEditability = false; doc.exportFile(saveFile, ExportType.SVG, svgOptions);
4. 增强稳定性与调试能力
- 优化异常捕获:在catch块中添加详细日志,方便定位出错文件:
catch (e) { $.writeln("处理文件" + file.name + "出错:" + e.message + "\n堆栈信息:" + e.stack); if (doc && !doc.closed) { doc.close(SaveOptions.DONOTSAVECHANGES); } } - 检查文件兼容性:部分SVG可能包含Illustrator不支持的元素(如复杂滤镜、自定义字体),可先手动测试单个文件,排查是否存在损坏或不兼容的SVG。
- 调整延迟时间:
$.sleep(1000)可根据系统性能适当缩短(如500ms),但需确保Illustrator完成当前文件的导出与关闭操作。
内容的提问来源于stack exchange,提问作者Daniel Sommerfeld
相关产品推荐
相关产品推荐

