[in]失败后停止【值/表达式】False
[in]脚本内容【值/表达式】function exec() {\r\n
\r\n
try {\r\n
\r\n
var configJson = quickerGetVar('configJson');\r\n
var selectedTags = quickerGetVar('选中标签');\r\n
var selectedFilePaths = quickerGetVar('selectedFilePaths');\r\n
var isSmartSort = quickerGetVar('isSmartSort') === true; // 获取排序开关\r\n
var url = quickerGetVar('url') || '';\r\n
var selectedText = quickerGetVar('selectedText') || ''; // 新增参数\r\n
\r\n
// 【新增参数】获取前台窗口标题\r\n
var windowTitle = quickerGetVar('windowTitle') || ''; \r\n
\r\n
// --- 【新增:获取用户定义的半衰期天数】 ---\r\n
var halfLifeDays = Number(quickerGetVar('halfLifeDays')) || 7; \r\n
\r\n
if (!configJson || !selectedTags) {\r\n
quickerSetVar('error', 'configJson 或 选中标签 不能为空');\r\n
return 1;\r\n
}\r\n
\r\n
// 解析文件路径\r\n
if (typeof selectedFilePaths === 'string') {\r\n
selectedFilePaths = selectedFilePaths.split(',').map(s => s.trim()).filter(Boolean);\r\n
}\r\n
if (!Array.isArray(selectedFilePaths)) selectedFilePaths = [];\r\n
\r\n
// 解析 config\r\n
var config;\r\n
try { config = JSON.parse(configJson); }\r\n
catch (e) { quickerSetVar('error', 'JSON 解析失败: ' + e.message); return 2; }\r\n
if (!Array.isArray(config.menuItems)) { quickerSetVar('error', 'menuItems 不是数组'); return 3; }\r\n
\r\n
if (!Array.isArray(config.tagDictionary)) {\r\n
quickerSetVar('error', 'tagDictionary 不是数组');\r\n
return 4;\r\n
}\r\n
\r\n
// 构建标签映射 (Tag Map)\r\n
var tagMap = {};\r\n
config.tagDictionary.forEach(function(tagObj) {\r\n
tagMap[tagObj.Tag] = tagObj;\r\n
});\r\n
\r\n
// 从 tagDictionary 获取源标签顺序\r\n
var tagOrder = config.tagDictionary.map(t => t.Tag);\r\n
var selectedTagSet = new Set(selectedTags.split(',').map(t=>t.trim()).filter(Boolean));\r\n
\r\n
// --- 文件匹配函数 ---\r\n
function isMatchFiles(item) {\r\n
if (!selectedFilePaths.length) return true; // 没有选中文件,全部显示\r\n
if (!item || !item.matchExt || typeof item.matchExt !== 'string' || item.matchExt.trim() === '') return true;\r\n
\r\n
// 将 matchExt 文本分隔成数组(支持多种分隔符: ; ; , ,)\r\n
var exts = item.matchExt.split(/[,;,;]/).map(s => s.trim()).filter(Boolean);\r\n
\r\n
// 只有所有选中文件都符合 matchExt 才显示\r\n
return selectedFilePaths.every(fp => {\r\n
var lower = fp.toLowerCase();\r\n
return exts.some(ext => lower.endsWith(ext.toLowerCase()));\r\n
});\r\n
}\r\n
\r\n
// --- URL 匹配函数(匹配任意一个即可) ---\r\n
function isMatchUrl(item, url) {\r\n
if (!url || !item || !item.matchUrl || typeof item.matchUrl !== 'string' || item.matchUrl.trim() === '') return true;\r\n
\r\n
var patterns = item.matchUrl.split(/[,;,;]/).map(s => s.trim()).filter(Boolean);\r\n
\r\n
return patterns.some(pat => {\r\n
try {\r\n
if (/^\/.*\/$/.test(pat)) {\r\n
var reg = new RegExp(pat.slice(1, -1));\r\n
return reg.test(url);\r\n
} else {\r\n
return url.includes(pat);\r\n
}\r\n
} catch (e) {\r\n
return false;\r\n
}\r\n
});\r\n
}\r\n
\r\n
// --- 窗口标题匹配函数(匹配任意一个片段即可) ---\r\n
function isMatchTitle(item, title) {\r\n
if (!title || !item || !item.matchTitle || typeof item.matchTitle !== 'string' || item.matchTitle.trim() === '') return true;\r\n
\r\n
var patterns = item.matchTitle.split(/[,;,;]/).map(s => s.trim()).filter(Boolean);\r\n
\r\n
return patterns.some(pat => {\r\n
return title.includes(pat);\r\n
});\r\n
}\r\n
\r\n
function deepClone(obj) { \r\n
if (!obj) return null;\r\n
// 直接通过键值对创建新对象,跳过 JSON 序列化的巨大开销\r\n
return {\r\n
Title: obj.Title || "",\r\n
Icon: obj.Icon || "",\r\n
Description: obj.Description || "",\r\n
Operation: obj.Operation || "none",\r\n
Action: obj.Action || "",\r\n
Data: obj.Data || "",\r\n
IsSeparator: obj.IsSeparator === true,\r\n
uuid: obj.uuid || "",\r\n
// 只有匹配逻辑需要的字段才克隆\r\n
Tags: Array.isArray(obj.Tags) ? obj.Tags.slice() : [],\r\n
matchExt: obj.matchExt || "",\r\n
matchUrl: obj.matchUrl || "",\r\n
matchTitle: obj.matchTitle || "",\r\n
usageCount: Number(obj.usageCount) || 0,\r\n
updatedAt: Number(obj.updatedAt) || 0\r\n
};\r\n
}\r\n
\r\n
// function deepClone(obj) { \r\n
// var cloned = JSON.parse(JSON.stringify(obj || {}));\r\n
// \r\n
// // 处理图标链接,自动添加 url: 前缀\r\n
// if (cloned.Icon && typeof cloned.Icon === 'string') {\r\n
// var icon = cloned.Icon.trim();\r\n
// // 如果是URL格式且没有以"url:"开头,则添加前缀\r\n
// if ((icon.startsWith('http://') || icon.startsWith('https://')) && !icon.startsWith('url:')) {\r\n
// cloned.Icon = 'url:' + icon;\r\n
// }\r\n
// }\r\n
// \r\n
// return cloned;\r\n
// }\r\n
\r\n
// --- 【性能优化核心:构建父子关系索引】 ---\r\n
var menuMap = {};\r\n
var childrenMap = {}; // 新增:专门存储每个 ID 下的子项数组\r\n
\r\n
// 1. 预处理数据:规范化父子关系并建立索引\r\n
config.menuItems.forEach(function(it) {\r\n
var pid = (!it.parentId || it.parentId === "null") ? "" : String(it.parentId);\r\n
it.parentId = pid;\r\n
it._parentUuid = pid === "" ? null : pid;\r\n
menuMap[it.uuid] = it;\r\n
\r\n
// 将该项加入其父级的子项列表中\r\n
if (!childrenMap[pid]) {\r\n
childrenMap[pid] = [];\r\n
}\r\n
childrenMap[pid].push(it);\r\n
});\r\n
\r\n
var seenUUID = new Set();\r\n
\r\n
function buildFilteredNode(node, tagSet, tagMap, selectedContextTags) {\r\n
\r\n
if (!node || node.deleted) return null;\r\n
\r\n
// --- 【修正:定义变量并获取 ID】 ---\r\n
// 统一使用 uuid 字段,因为 buildMap 已经规范化了索引键\r\n
var currentUUID = node.uuid || "";\r\n
\r\n
// 【性能修复】:直接从索引中获取子项,不再全量扫描数组\r\n
var rawChildren = (childrenMap[currentUUID] || []).filter(function(m) {\r\n
return !m.deleted;\r\n
});\r\n
var wasContainer = rawChildren.length > 0; \r\n
\r\n
var copy = deepClone(node);\r\n
if (!Array.isArray(copy.Tags)) copy.Tags = [];\r\n
\r\n
// --- 【修正:所有类型都存入 UUID】 ---\r\n
if (currentUUID) {\r\n
copy.OriginText = currentUUID;\r\n
}\r\n
\r\n
// 【新增逻辑】:如果开启了智能排序,且当前项是分割线,则直接过滤掉\r\n
if (isSmartSort && copy.IsSeparator === true) {\r\n
return null;\r\n
}\r\n
\r\n
// 只有 action 类型且 Data 为空时,才填充选中文本\r\n
if (copy.Operation === "action") {\r\n
if ((!copy.Data || copy.Data.trim() === "") && selectedText) {\r\n
copy.Data = selectedText;\r\n
}\r\n
}\r\n
\r\n
// --- 黑名单过滤 (修复误杀逻辑) ---\r\n
// 这里的 tagSet 如果是 null,说明是递归子项,跳过黑名单和标签检查\r\n
if (tagSet) {\r\n
var triggeringTag = Array.from(tagSet)[0]; \r\n
var tagObj = tagMap[triggeringTag];\r\n
if (tagObj && Array.isArray(tagObj.blacklist) && tagObj.blacklist.length > 0) {\r\n
var blacklist = tagObj.blacklist;\r\n
var contextTagsArray = Array.from(selectedTagSet);\r\n
for (var k = 0; k < contextTagsArray.length; k++) {\r\n
var contextTag = contextTagsArray[k];\r\n
if (contextTag === triggeringTag || contextTag.trim() === '') continue;\r\n
\r\n
// 修改点:判断菜单项自己是否有这个场景标签,如果有,就不执行拉黑\r\n
if (blacklist.indexOf(contextTag) !== -1) {\r\n
if (copy.Tags.indexOf(contextTag) === -1) {\r\n
return null;\r\n
}\r\n
}\r\n
}\r\n
}\r\n
}\r\n
\r\n
var fileMatch = isMatchFiles(copy);\r\n
var urlMatch = isMatchUrl(copy, url);\r\n
var titleMatch = isMatchTitle(copy, windowTitle); \r\n
\r\n
var hasNonEmptyFileCondition = copy.matchExt && typeof copy.matchExt === 'string' && copy.matchExt.trim() !== '';\r\n
var hasNonEmptyUrlCondition = copy.matchUrl && typeof copy.matchUrl === 'string' && copy.matchUrl.trim() !== '';\r\n
var hasNonEmptyTitleCondition = copy.matchTitle && typeof copy.matchTitle === 'string' && copy.matchTitle.trim() !== ''; \r\n
\r\n
if ((hasNonEmptyFileCondition && !fileMatch) || \r\n
(hasNonEmptyUrlCondition && !urlMatch) ||\r\n
(hasNonEmptyTitleCondition && !titleMatch)) {\r\n
return null; \r\n
}\r\n
\r\n
// 直接使用前面已经筛选好的 rawChildren\r\n
if (wasContainer) {\r\n
var keptChildren = [];\r\n
rawChildren.forEach(function(ch) {\r\n
// 递归处理子项:子项不受父级标签强制约束\r\n
var kc = buildFilteredNode(ch, null, tagMap, selectedTagSet); \r\n
if (kc) keptChildren.push(kc);\r\n
});\r\n
\r\n
// 只有子项存在时才进行排序\r\n
if (isSmartSort && keptChildren.length > 0) {\r\n
keptChildren.sort(function(a, b) {\r\n
var now = Date.now();\r\n
var HALF_LIFE = halfLifeDays * 24 * 60 * 60 * 1000;\r\n
var scoreA = (Number(a.usageCount) || 0) * Math.pow(0.5, (now - (a.updatedAt || 0)) / HALF_LIFE);\r\n
var scoreB = (Number(b.usageCount) || 0) * Math.pow(0.5, (now - (b.updatedAt || 0)) / HALF_LIFE);\r\n
if (scoreB !== scoreA) return scoreB - scoreA;\r\n
return (b.updatedAt || 0) - (a.updatedAt || 0);\r\n
});\r\n
}\r\n
\r\n
if (keptChildren.length > 0) copy.Children = keptChildren;\r\n
else delete copy.Children;\r\n
}\r\n
\r\n
// --- 最终显示判断 ---\r\n
// 如果是递归子项(tagSet为null),只要环境匹配(文件/URL)就允许返回\r\n
if (tagSet === null) return copy;\r\n
\r\n
var hasTag = copy.Tags.some(function(t) { return tagSet.has(t); });\r\n
var childrenKept = Array.isArray(copy.Children) && copy.Children.length > 0;\r\n
\r\n
if (childrenKept) return copy; \r\n
if (wasContainer) return null;\r\n
if (hasTag && fileMatch && urlMatch && titleMatch) return copy; \r\n
\r\n
return null;\r\n
}\r\n
\r\n
function addNodeWithDedup(node, finalMenuArr) {\r\n
if (!node) return;\r\n
var currentUUID = node.uuid || "";\r\n
if (currentUUID && seenUUID.has(currentUUID)) return;\r\n
\r\n
// 【核心精简点】:在这里只手动挑选 UI 需要的字段\r\n
var simplifiedNode = {\r\n
Title: node.Title || "",\r\n
Icon: node.Icon || "",\r\n
Description: node.Description || "",\r\n
Operation: node.Operation || "none",\r\n
Action: node.Action || "",\r\n
Data: node.Data || "",\r\n
IsSeparator: node.IsSeparator || false,\r\n
uuid: currentUUID\r\n
};\r\n
\r\n
// 处理子级(递归瘦身)\r\n
if (Array.isArray(node.Children) && node.Children.length > 0) {\r\n
var childrenFiltered = [];\r\n
node.Children.forEach(function(c) {\r\n
var cUUID = c.uuid || "";\r\n
if (!cUUID || !seenUUID.has(cUUID)) {\r\n
// 这里我们手动递归调用自身,确保子菜单也被瘦身\r\n
addNodeWithDedup(c, childrenFiltered);\r\n
}\r\n
});\r\n
if (childrenFiltered.length > 0) simplifiedNode.Children = childrenFiltered;\r\n
}\r\n
\r\n
if (currentUUID) seenUUID.add(currentUUID);\r\n
finalMenuArr.push(simplifiedNode);\r\n
}\r\n
\r\n
// --- 构建标签组映射 ---\r\n
var tagToItems = {}; \r\n
// 使用 Object.keys 遍历 menuMap,直接从扁平化索引中提取符合标签的项\r\n
var itemAssignedTag = {}; // 记录每个项已分配到哪个标签\r\n
Object.keys(menuMap).forEach(function(uuid) {\r\n
var item = menuMap[uuid];\r\n
// 只处理顶层项(没有父级的项),防止子项在不该出现的时候被错误提拔到顶层\r\n
if (item._parentUuid !== null || !Array.isArray(item.Tags)) return;\r\n
\r\n
// 按照 tagOrder 的顺序查找第一个匹配的标签\r\n
for (var j = 0; j < tagOrder.length; j++) {\r\n
var orderedTag = tagOrder[j];\r\n
if (selectedTagSet.has(orderedTag) && item.Tags.indexOf(orderedTag) !== -1) {\r\n
// --- 【新增:检查黑名单】 ---\r\n
var tagObj = tagMap[orderedTag];\r\n
var isBlacklisted = false;\r\n
\r\n
if (tagObj && Array.isArray(tagObj.blacklist) && tagObj.blacklist.length > 0) {\r\n
var blacklist = tagObj.blacklist;\r\n
var hasSpecificContextTag = false;\r\n
var contextTagsArray = Array.from(selectedTagSet);\r\n
\r\n
for (var k = 0; k < contextTagsArray.length; k++) {\r\n
var contextTag = contextTagsArray[k];\r\n
if (contextTag === orderedTag || contextTag.trim() === '') continue;\r\n
\r\n
if (contextTag !== 'global') {\r\n
// 【核心修正点】:\r\n
// 只有当“当前项”不包含这个 contextTag 时,才触发拉黑逻辑。\r\n
// 这样,如果菜单项同时有 global 和 text,即便 global 拉黑 text,它也不会消失。\r\n
if (blacklist.includes(contextTag) && (!item.Tags || !item.Tags.includes(contextTag))) {\r\n
isBlacklisted = true;\r\n
break;\r\n
}\r\n
}\r\n
}\r\n
if (blacklist.includes('global') && !item.Tags.includes('global')) {\r\n
isBlacklisted = true;\r\n
}\r\n
}\r\n
\r\n
// 如果被拉黑,跳过这个标签,继续尝试下一个\r\n
if (isBlacklisted) continue;\r\n
// --- 【黑名单检查结束】 ---\r\n
\r\n
if (!tagToItems[orderedTag]) tagToItems[orderedTag] = [];\r\n
tagToItems[orderedTag].push(item);\r\n
itemAssignedTag[uuid] = orderedTag; // 记录已分配\r\n
break; // 找到第一个匹配的标签后停止\r\n
}\r\n
}\r\n
});\r\n
\r\n
// --- 构建 finalMenu ---\r\n
var finalMenu = [];\r\n
tagOrder.forEach(function(tag){\r\n
var items = tagToItems[tag];\r\n
if (!items || !items.length) return;\r\n
\r\n
var filteredItemsForThisTag = [];\r\n
items.forEach(function(top){\r\n
// 【核心修改点】\r\n
// 传入一个特殊的标记,或者将该项的所有标签都传入,\r\n
// 确保父节点被选中后,其下的通用子项(如标记为 global 的)不会被剔除。\r\n
var allMyTags = new Set(top.Tags || []);\r\n
var kept = buildFilteredNode(top, allMyTags, tagMap, selectedTagSet);\r\n
\r\n
if (kept) {\r\n
filteredItemsForThisTag.push(kept); \r\n
}\r\n
});\r\n
\r\n
// 2. 如果开启了智能排序,对【已过滤出】的项进行排序\r\n
if (isSmartSort && filteredItemsForThisTag.length > 0) {\r\n
filteredItemsForThisTag.sort(function(a, b) {\r\n
// --- 实时衰减逻辑开始 ---\r\n
var now = Date.now();\r\n
// --- 【修改点:使用用户输入的半衰期值】 ---\r\n
var HALF_LIFE = halfLifeDays * 24 * 60 * 60 * 1000; \r\n
\r\n
// 计算 a 的实时得分\r\n
var lastA = a.updatedAt || (now - 1000 * 60 * 60 * 24 * 365); // 默认一年前\r\n
var scoreA = (Number(a.usageCount) || 0) * Math.pow(0.5, (now - lastA) / HALF_LIFE);\r\n
\r\n
// 计算 b 的实时得分\r\n
var lastB = b.updatedAt || (now - 1000 * 60 * 60 * 24 * 365); // 默认一年前\r\n
var scoreB = (Number(b.usageCount) || 0) * Math.pow(0.5, (now - lastB) / HALF_LIFE);\r\n
\r\n
// 按实时计算后的分数进行降序排列\r\n
if (scoreB !== scoreA) return scoreB - scoreA;\r\n
\r\n
// 如果得分极其接近(如都是0),则按原始更新时间兜底\r\n
return (b.updatedAt || 0) - (a.updatedAt || 0);\r\n
// --- 实时衰减逻辑结束 ---\r\n
});\r\n
}\r\n
\r\n
// 3. 将排序后的项加入最终菜单\r\n
if (filteredItemsForThisTag.length > 0) {\r\n
if (finalMenu.length > 0) {\r\n
finalMenu.push({ IsSeparator: true });\r\n
}\r\n
filteredItemsForThisTag.forEach(function(keptItem){\r\n
addNodeWithDedup(keptItem, finalMenu);\r\n
});\r\n
}\r\n
});\r\n
\r\n
quickerSetVar('CommonOperationItems', JSON.stringify(finalMenu, null, 2));\r\n
quickerSetVar('success', true);\r\n
quickerSetVar('count', finalMenu.length);\r\n
return 0;\r\n
\r\n
} catch (err) {\r\n
quickerSetVar('error', '生成 CommonOperationItems 出错: ' + (err && err.message ? err.message : err));\r\n
return 99;\r\n
}\r\n
}
[in]允许访问.Net程序集【值/表达式】True
[out]脚本写入=>CommonOperationItems[\n
{\n
"Title": "示例菜单",\n
"Icon": "fa:Light_CommentAltExclamation",\n
"Description": "示例菜单,仅供新手学习参考使用,熟悉后可删除!",\n
"Operation": "none",\n
"Action": "",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "9b164b9a-344e-40fd-8b68-62cf08c152fb"\n
},\n
{\n
"Title": "应用",\n
"Icon": "url:https://files.getquicker.net/_sitefiles/_guides/c7aef61c-1c2d-4a24-c65c-08dc35d31730/2024/02/26/223350_202824_icons8-old-computer-80.png",\n
"Description": "",\n
"Operation": "none",\n
"Action": "",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "48219e04-c67a-46f7-83c3-ab912e49d7e1",\n
"Children": [\n
{\n
"Title": "PicList",\n
"Icon": "https://helperservice.getquicker.cn/exeicon/get/PicList.exe",\n
"Description": "",\n
"Operation": "run",\n
"Action": "",\n
"Data": "D:\\PicList\\PicList.exe",\n
"IsSeparator": false,\n
"uuid": "e2a6a3ff-550c-4d6d-a8e8-f734e0ef98de"\n
}\n
]\n
},\n
{\n
"Title": "常用语",\n
"Icon": "url:https://files.getquicker.net/_icons/928D0DC5B635B3CB29E58F2BDEAE8A5FE7AFB93E.png",\n
"Description": "",\n
"Operation": "none",\n
"Action": "",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "fafbd767-1993-460e-a266-6201f13d51fa"\n
},\n
{\n
"Title": "常用命令",\n
"Icon": "url:https://files.getquicker.net/_sitefiles/_guides/c7aef61c-1c2d-4a24-c65c-08dc35d31730/2024/02/27/143550_202824_console.png",\n
"Description": "",\n
"Operation": "none",\n
"Action": "",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "03cdc9aa-9e04-40cb-9703-b8b30c49084d"\n
},\n
{\n
"IsSeparator": true\n
},\n
{\n
"Title": "关闭其它",\n
"Icon": "fa:Light_CodeCommit",\n
"Description": "",\n
"Operation": "action",\n
"Action": "c89d6ff4-0b61-4dcd-b8c7-a24df5c577f2",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "c3bc174e-8a84-4cb2-ae67-7d9dc02c143f"\n
},\n
{\n
"Title": "关闭左侧标签页",\n
"Icon": "fa:Light_ArrowToLeft",\n
"Description": "",\n
"Operation": "action",\n
"Action": "7835523f-40d7-4173-bd15-2a9d914763b2",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "36c36247-ce0e-4d33-a9ca-6f75e495de27"\n
},\n
{\n
"Title": "关闭右侧标签页",\n
"Icon": "fa:Light_ArrowFromLeft",\n
"Description": "",\n
"Operation": "action",\n
"Action": "991ce3d7-91dc-447d-b933-6dcc9a89e044",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "75fbbd1c-b584-4b1b-83e6-df1e8fc9ac6b"\n
},\n
{\n
"Title": "关闭同域名",\n
"Icon": "fa:Light_FolderTimes",\n
"Description": "",\n
"Operation": "action",\n
"Action": "83e39151-e0bc-4e6d-ae69-663ebc90664a",\n
"Data": "",\n
"IsSeparator": false,\n
"uuid": "b1ba70a6-800a-47db-8d48-edc91595e5f5"\n
},\n
{\n
"Title": "标签页分组",\n
"Icon": "fa:Solid_Betamax",\n
"Description": "",\n
"Operation": "action",\n
"Action": "d2bc93c2-9dc3-4157-89c2-57888a2aa741",\n
"Data": "",\n
"IsSeparator": true,\n
"uuid": "f398f733-fef1-42a2-8e74-36d0db9d8518"\n
},\n
{\n
"Title": "优酷",\n
"Icon": "https://helperservice.getquicker.cn/favicon/get/www.youku.com",\n
"Description": "",\n
"Operation": "run",\n
"Action": "",\n
"Data": "https://www.youku.com/",\n
"IsSeparator": false,\n
"uuid": "b1591eae-cf77-42ed-8f26-96f72a3fe8f8"\n
},\n
{\n
"Title": "哔哩",\n
"Icon": "https://helperservice.getquicker.cn/favicon/get/www.bilibili.com",\n
"Description": "",\n
"Operation": "run",\n
"Action": "",\n
"Data": "https://www.bilibili.com/",\n
"IsSeparator": false,\n
"uuid": "59fad71f-d7be-458f-a171-4a6c077b01f9"\n
},\n
{\n
"Title": "GitHub",\n
"Icon": "https://helperservice.getquicker.cn/favicon/get/github.com",\n
"Description": "",\n
"Operation": "run",\n
"Action": "",\n
"Data": "https://github.com/",\n
"IsSeparator": false,\n
"uuid": "29f12d47-e825-4dd7-8ba6-2eee60641638"\n
}\n
]
[out]脚本写入=>successTrue
[out]脚本写入=>count13
[out]是否成功=>isSuccessTrue
耗时:4ms