其他文件类型与只含有文件的单独文件夹都可以重命名,但是内有子文件夹的母文件夹则提示访问被拒绝,调试运行结果如下:
5Win-10.0.19042.0 Quicker-1.22.35.0 动作ID:697e2e16-c084-412d-b6b9-d9f70fbaac19 来源动作:fac14427-c0f5-4567-c945-08d99706f10d v3
7Log文件路径:C:\Users\shive\AppData\Local\Temp\quicker_规范文件命名_043200-801_log.htm 在资源管理器中查看 复制文件
7开始执行动作:规范文件命名 2021-11-11 16:32:00
90生成临时文件路径生成脚本文件
[in]扩展名【值/表达式】.py
[out]文件路径=>临时Python脚本位置C:\Users\shive\AppData\Local\Temp\quicker_60f7f97c-d003-464e-8c9c-603749527e52.py
121写入文本文件将脚本内容写入py文件
[in]文件路径【变量 临时Python脚本位置】C:\Users\shive\AppData\Local\Temp\quicker_60f7f97c-d003-464e-8c9c-603749527e52.py
[in]内容【值/表达式】import sys\r\n
import re\r\n
from datetime import datetime\r\n
from os import path\r\n
import json\r\n
from pprint import pprint\r\n
\r\n
输入文件 = sys.argv[1]\r\n
# 输入文件 = r"D:/(20210512-091500)大类-大类2-标题(v1.1.1)#标签1#标签2@人物1@人物2=&评论.jpg"\r\n
# 输入文件 = r"D:/(2021-05-12)大类-大类2-标题(v1.1.1)#标签1#标签2@人物1@人物2=&评论.jpg"\r\n
# 输入文件 = r"D:/img(2021-05)大类-大类2-标题(v1.1.1)#标签1#标签2@人物1@人物2=&评论.jpg"\r\n
# 输入文件 = r"1111标题(v1.1.1.beta)#标签1#标签2@人物1@人物2&评论.jpg"\r\n
# 输入文件 = r"20211025-102501__OPPO-Giant__Proj1.S1.Rn4D.4k60.sLog3__BTS__Li.mov"\r\n
# 输入文件 = r"d:/mmexport1111416781651.mov"\r\n
# 输入文件 = r"20211025-102501__Proj1.S1.Rn4D.4k60.sLog3__Li.mov"\r\n
# 输入文件 = r"2021-10-25__Proj1.S1.Rn4D.4k60.sLog3.mov"\r\n
文件名 = path.basename(输入文件) \r\n
文件名无后缀 = path.splitext(文件名)[0] if path.isfile(输入文件) else 文件名\r\n
\r\n
\r\n
def 解析严格标准名字(文件无后缀名字):\r\n
'''\r\n
由于块间分隔符相同,无法分辨出哪个是标签,哪个是人物,只能返回李模糊匹配的字典:\r\n
{\r\n
'文本块': ['前缀', '标题', '标签', '人物', '评论'],\r\n
'时间': datetime.datetime(2021, 10, 25, 10, 25, 1),\r\n
'版本': ''\r\n
}\r\n
'''\r\n
\r\n
组1 = f'(?:[^\d]*)[^\d]?[\d\-_]*\)?' # 时间\r\n
组2 = r'[^_]+_*' # 前缀\r\n
组3 = r'[^_]+_*' # 标题\r\n
组4 = r'v[^_]+_*' # 版本\r\n
组5 = r'[^_]+_*' # 标签\r\n
组6 = r'[^_]+_*' # 人物\r\n
组7 = r'[^_]+_*' # 评论\r\n
\r\n
标准名字匹配结果 = re.match(\r\n
f'({组1})?({组2})?({组3})?({组4})?({组5})?({组6})?({组7})?', 文件无后缀名字)\r\n
\r\n
非时间数据块列表 = [标准名字匹配结果.group(i).strip('_') \\r\n
for i in [2, 3, 5, 6, 7] \\r\n
if 标准名字匹配结果.group(i)]\r\n
\r\n
时间 = 从字符串得到时间(标准名字匹配结果.group(1)) if 标准名字匹配结果.group(1) else ''\r\n
版本 = 标准名字匹配结果.group(4) if 标准名字匹配结果.group(4) else ''\r\n
\r\n
结果 = {'时间': 时间, '版本': 版本, '文本块': 非时间数据块列表}\r\n
\r\n
return 结果\r\n
\r\n
def 解析宽松标准名字(文件无后缀名字):\r\n
\r\n
组1 = '(?:[^\d]*)[^\d]?[\d\-_]{4,}\)?' # 时间\r\n
组2 = r'[^\(#@&]+-' # 前缀\r\n
组3 = r'[^\(#@&]+' # 标题\r\n
组4 = r'\([^#@&]+\)' # 版本\r\n
组5 = r'#[^@&]+' # 标签\r\n
组6 = r'@[^&]+' # 人物\r\n
组7 = r'&.+' # 评论\r\n
\r\n
标准名字匹配结果 = re.match(\r\n
f'({组1})?({组2})?({组3})?({组4})?({组5})?({组6})?({组7})?', 文件无后缀名字)\r\n
\r\n
时间 = 标准名字匹配结果.group(1) if 标准名字匹配结果.group(1) else ''\r\n
前缀 = 标准名字匹配结果.group(2) if 标准名字匹配结果.group(2) else ''\r\n
标题 = 标准名字匹配结果.group(3) if 标准名字匹配结果.group(3) else ''\r\n
版本 = 标准名字匹配结果.group(4) if 标准名字匹配结果.group(4) else ''\r\n
标签 = 标准名字匹配结果.group(5) if 标准名字匹配结果.group(5) else ''\r\n
人物 = 标准名字匹配结果.group(6) if 标准名字匹配结果.group(6) else ''\r\n
评论 = 标准名字匹配结果.group(7) if 标准名字匹配结果.group(7) else ''\r\n
\r\n
时间 = 从字符串得到时间(时间)\r\n
时间 = 时间 if 时间 else ''\r\n
前缀 = 前缀.strip('-')\r\n
版本 = 版本.strip('()')\r\n
标签 = 标签.replace('#', '\r\n#').lstrip()\r\n
人物 = 人物.replace('@', '\r\n@').lstrip()\r\n
评论 = 评论.replace('&', '\r\n').lstrip()\r\n
\r\n
if not 时间 and not 前缀 and not 版本 and not 标签 and not 人物 and not 评论:\r\n
标题 = 文件无后缀名字\r\n
\r\n
结果 = {'文件名时间': 时间, \r\n
'前缀': 前缀, '标题': 标题, \r\n
'版本': 版本, \r\n
'标签': 标签, '人物': 人物, '评论': 评论}\r\n
\r\n
return 结果\r\n
\r\n
def 从字符串得到时间(字符串):\r\n
全数字 = ''.join(re.findall(r'\d+', 字符串))\r\n
当前时间 = datetime.now()\r\n
\r\n
try:\r\n
# 年月日时分秒\r\n
时间 = datetime.fromisoformat(\r\n
f'{全数字[0:4]}-{全数字[4:6]}-{全数字[6:8]} {全数字[8:10]}:{全数字[10:12]}:{全数字[12:14]}'\r\n
)\r\n
return f'{时间.year}{时间.month}{时间.day}-{时间.hour}{时间.minute}{时间.second}'\r\n
except:\r\n
...\r\n
try:\r\n
# 年月日\r\n
if len(全数字) == 8:\r\n
时间 = datetime.fromisoformat(\r\n
f'{全数字[0:4]}-{全数字[4:6]}-{全数字[6:8]} 00:00:00'\r\n
)\r\n
return f'{时间.year}-{时间.month}-{时间.day}'\r\n
except:\r\n
...\r\n
try:\r\n
# 年月\r\n
if len(全数字) == 6:\r\n
时间 = datetime.fromisoformat(\r\n
f'{全数字[0:4]}-{全数字[4:6]}-01 00:00:00'\r\n
)\r\n
return f'{时间.year}-{时间.month}'\r\n
except:\r\n
...\r\n
try:\r\n
# 年\r\n
if len(全数字) == 4:\r\n
时间 = datetime.fromisoformat(\r\n
f'{全数字[0:4]}-01-01 00:00:00'\r\n
)\r\n
return f'{时间.year}'\r\n
except:\r\n
...\r\n
\r\n
\r\n
try:\r\n
# 类似 mmexport1111467816512.jpg\r\n
if re.match(r'.*[^\d]?(\d{13})([^\d]+)?', 文件名):\r\n
时间 = datetime.fromtimestamp(\r\n
int(全数字[0:13]) / 1000\r\n
)\r\n
return f'{时间.year}{时间.month}{时间.day}-{时间.hour}{时间.minute}{时间.second}'\r\n
except:\r\n
...\r\n
\r\n
try:\r\n
# 类似 121301190818c8f0c7010755.mp4\r\n
时间 = datetime.fromisoformat(\r\n
f'20{全数字[10:12]}-{全数字[8:10]}-{全数字[6:8]} {全数字[4:6]}:{全数字[2:4]}:{全数字[0:2]}').timestamp()\r\n
return f'{时间.year}{时间.month}{时间.day}-{时间.hour}{时间.minute}{时间.second}'\r\n
except:\r\n
...\r\n
\r\n
return False\r\n
\r\n
if __name__ == '__main__':\r\n
\r\n
# 结果 = 解析严格标准名字(文件名无后缀)\r\n
结果 = 解析宽松标准名字(文件名无后缀)\r\n
\r\n
结果 = json.dumps(结果, ensure_ascii=True)\r\n
\r\n
print(结果)\r\n
[in]文件编码【值/表达式】utf-8
[in]添加到文件末尾【值/表达式】False
[in]添加空行【值/表达式】False
[in]添加UTF-BOM【值/表达式】False
142获取剪贴板文本=> {剪切板内容}
[in]失败后中止动作【值/表达式】False
[in]文本数据格式【值/表达式】UnicodeText
247步骤执行失败,原因:获得的剪贴板文本为空。
2473获取选择的文件(夹)获取所选所有文件
[in]失败后中止动作【值/表达式】True
260通过Win32接口获得了1个文件
[out]路径列表=>路径列表0:E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛
2604如果判断条件:$={剪切板内容} != ''
[in]如果【值/表达式】False
263不符合条件,跳过。
2635重复对每一个文件都进行命名
[in]次数【值/表达式】1
[in]计数开始值【值/表达式】0
[in]循环间隔时间【值/表达式】1
264第 0 次循环
[out]计数=>循环次数0
2645.0检查路径/获取文件信息检查路径是否存在、是不是文件
[in]路径【值/表达式】E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛
[out]路径是否存在=>路径是否存在True
[out]是否为文件=>是否为文件False
2645.1如果要是获得的路径不存在,就进行下一步
[in]如果【值/表达式】False
265不符合条件,跳过。
2655.2如果/否则判断条件:$={是否为文件}
[in]如果【值/表达式】False
265执行 False 分支, 共 1 步骤
2655.2.1提取文件路径信息得到所在目录
[in]完整路径【值/表达式】E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛
[out]路径=>文件所在目录E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动
2665.3运行脚本使用Python对文件名进行正则匹配解析
[in]脚本内容【值/表达式】python "C:\Users\shive\AppData\Local\Temp\quicker_60f7f97c-d003-464e-8c9c-603749527e52.py" "E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛"
[in]脚本类型【值/表达式】CMD_K
[in]扩展名【无输入】
[in]使用指定软件【无输入】
[in]以管理员身份运行【值/表达式】False
[in]等待进程结束【值/表达式】True
[in]文件编码【值/表达式】utf-8
[in]工作目录【值/表达式】
[in]控制台输出编码【值/表达式】oem
[out]控制台输出=>Python脚本输出{"\u6587\u4ef6\u540d\u65f6\u95f4": "", "\u524d\u7f00": "", "\u6807\u9898": "\u9ad8\u804c\u9986\u957f\u8bba\u575b", "\u7248\u672c": "", "\u6807\u7b7e": "", "\u4eba\u7269": "", "\u8bc4\u8bba": ""}\r\n
3865.4提取JSON内容
[in]失败后停止【值/表达式】True
[in]输入【值/表达式】{"\u6587\u4ef6\u540d\u65f6\u95f4": "", "\u524d\u7f00": "", "\u6807\u9898": "\u9ad8\u804c\u9986\u957f\u8bba\u575b", "\u7248\u672c": "", "\u6807\u7b7e": "", "\u4eba\u7269": "", "\u8bc4\u8bba": ""}\r\n
[in]提取路径0【值/表达式】文件名时间
[out]值0=>时间
[in]提取路径1【值/表达式】前缀
[out]值1=>前缀
[in]提取路径2【值/表达式】标题
[out]值2=>标题高职馆长论坛
[in]提取路径3【值/表达式】版本
[out]值3=>版本
[in]提取路径4【值/表达式】标签
[out]值4=>标签
3875.5提取JSON内容
[in]失败后停止【值/表达式】True
[in]输入【值/表达式】{"\u6587\u4ef6\u540d\u65f6\u95f4": "", "\u524d\u7f00": "", "\u6807\u9898": "\u9ad8\u804c\u9986\u957f\u8bba\u575b", "\u7248\u672c": "", "\u6807\u7b7e": "", "\u4eba\u7269": "", "\u8bc4\u8bba": ""}\r\n
[in]提取路径0【值/表达式】人物
[out]值0=>人物
[in]提取路径1【值/表达式】评论
[out]值1=>评论
[in]提取路径2【值/表达式】
[in]提取路径3【值/表达式】
[in]提取路径4【值/表达式】
3875.6多字段表单重命名窗口
[in]取消后停止【值/表达式】False
[in]窗口标题【值/表达式】重命名
[in]表单定义【值/表达式】{"Fields":[{"FieldKey":"时间","Label":"时间","HelpText":"示例:2021、2021-10、2021-10-25、20211025-103000","HelpLink":null,"InputMethod":1,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""},{"FieldKey":"前缀","Label":"前缀","HelpText":"示例:01、00","HelpLink":null,"InputMethod":1,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""},{"FieldKey":"标题","Label":"标题","HelpText":"","HelpLink":null,"InputMethod":1,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""},{"FieldKey":"版本","Label":"版本","HelpText":"示例:v1.1、v2.1.1","HelpLink":null,"InputMethod":1,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""},{"FieldKey":"标签","Label":"标签","HelpText":"可以写多个标签,示例:#todo #done #舞蹈","HelpLink":null,"InputMethod":2,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""},{"FieldKey":"人物","Label":"人物","HelpText":"示例:@-小D-biu @小管家 @人事部","HelpLink":null,"InputMethod":2,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""},{"FieldKey":"评论","Label":"评论","HelpText":"简短的评论,别写太长,文件名不能超过255","HelpLink":null,"InputMethod":2,"SelectionItems":"","IsRequired":false,"MinValue":"","MaxValue":"","Pattern":"","MaxLength":0,"ImeState":null,"TextTools":"","VisibleExpression":""}]}
[in]提示文字【值/表达式】当前正在重命名第 1个,总共有 1 个\n
\n
原文件路径:E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛
[in]恢复活动窗口【值/表达式】False
[in]标题列宽度【值/表达式】50
[in]置顶显示【值/表达式】False
[out]=>时间2021
[out]=>前缀
[out]=>标题高职馆长论坛
[out]=>版本
[out]=>标签
[out]=>人物
[out]=>评论
[out]是否成功=>表单成功True
68285.7赋值=> {新文件路径}
[in]失败后停止【值/表达式】True
[in]输入【值/表达式】
[out]输出=>新文件路径
68285.8如果如果取消重命名
[in]如果【值/表达式】False
6829不符合条件,跳过。
68295.9如果如果时间块存在
[in]如果【值/表达式】True
6829执行 True 分支, 共 1 步骤
68295.9.0赋值$='(' + {时间} + ')' => {新文件路径}
[in]失败后停止【值/表达式】True
[in]输入【值/表达式】(2021)
[out]输出=>新文件路径(2021)
68305.10如果如果前缀块存在
[in]如果【值/表达式】False
6830不符合条件,跳过。
68305.11如果如果标题块存在
[in]如果【值/表达式】True
6831执行 True 分支, 共 1 步骤
68315.11.0赋值$={新文件路径} + {标题}.... => {新文件路径}
[in]失败后停止【值/表达式】True
[in]输入【值/表达式】(2021)高职馆长论坛
[out]输出=>新文件路径(2021)高职馆长论坛
68325.12如果如果版本块存在
[in]如果【值/表达式】False
6832不符合条件,跳过。
68325.13如果如果标签块存在
[in]如果【值/表达式】False
6833不符合条件,跳过。
68335.14如果如果人物块存在
[in]如果【值/表达式】False
6833不符合条件,跳过。
68335.15如果如果评论块存在
[in]如果【值/表达式】False
6834不符合条件,跳过。
68345.16文本处理确保文件名长度小于 255
[in]失败后停止【值/表达式】True
[in]待处理内容【值/表达式】(2021)高职馆长论坛
[in]处理【值/表达式】substring
[in]开始位置【值/表达式】0
[in]长度【值/表达式】255
[out]结果=>新文件路径(2021)高职馆长论坛
68355.17赋值加上目录、后缀名
[in]失败后停止【值/表达式】True
[in]输入【值/表达式】E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\(2021)高职馆长论坛
[out]输出=>新文件路径E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\(2021)高职馆长论坛
68365.18如果如果没有进行重命名
[in]如果【值/表达式】False
6837不符合条件,跳过。
68375.19检查路径/获取文件信息先检查下新路径是否冲突
[in]路径【值/表达式】E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\(2021)高职馆长论坛
[out]路径是否存在=>新路径是否已存在False
68385.20如果如果冲突
[in]如果【值/表达式】False
6838不符合条件,跳过。
68395.21文件和目录操作执行重命名
[in]失败后中止动作【值/表达式】True
[in]操作类型【值/表达式】rename
[in]路径【值/表达式】E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛
[in]目标路径/名称【变量 新文件路径】E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\(2021)高职馆长论坛
[in]覆盖已有【值/表达式】False
6840步骤执行失败,原因:对路径“E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛”的访问被拒绝。
6847停止动作:对路径“E:\读研\我的坚果云\500-Work\200 工作内容\210-市场活动\高职馆长论坛”的访问被拒绝。
6847检测到了中止标志(OperationFailed),停止后续步骤执行。
6847检测到了中止标志(OperationFailed),停止后续步骤执行。
6847动作结束