@mlrpadilla询问当 JMP 没有机会保存文件时如何恢复文件。在不可避免的计算机/JMP 关闭的情况下,如何恢复 JMP 文件的最新工作?
一年前,我在使用 .JSL 脚本时也有过类似的经历,当时电源故障让我花费了几个小时的工作时间。 我编写了一个插件来定期查找打开的 JSL 文件并制作它们的快照。 它不会对 JMP 数据表进行快照。 它仅适用于 Windows。 但从那以后,它已经为我保存了几次 JSL。 它也至少让我失望过一次(如下。)
FileSnapper 插件
安装后,FileSnapper 插件脚本每五分钟运行一次(默认),并查看打开的窗口以查找已修改的脚本窗口。 当它找到一个时,它会抓取文本并将其保存起来。
如果 JMP 没有机会正常关闭,则会留下一个标记文件。 下次 JMP 启动并找到标记时,JMP 将打开 FileSnapper 对话框,让您查看是否有要恢复的快照。 您还可以从加载项菜单打开对话框并设置一些属性(如 5 分钟间隔和 14 天保留期。)
这个怎么运作
为了使 FileSnapper 尽可能不可见,它不使用 JSL 调度程序。 (调度程序会打开一个窗口,并且只有一个调度程序可以用于其他用途。)相反,FileSnapper 使用 RunProgram 来获得定期唤醒呼叫。 有多次迭代;当前版本使用 CMD.EXE 和 DOS等待循环中的命令以每五分钟将一些文本发送回 FileSnapper。 当 JMP 关闭时,它会向等待使 CMD.EXE 快速退出的事件。 如果哨兵消失,CMD.EXE 也将终止。
一个小型 JMP 数据表用于标记文件。 该表已保存,但也作为私有表保持打开状态。 如果 JMP 的第二个副本运行,它会检测到该表在另一个 JMP 副本中打开,并且 (1) 不打开恢复对话框并且 (2) 制作不同的哨兵文件。 如果找到任何未打开的哨兵,所有未打开的哨兵将被删除并打开恢复对话框。 您应该只收到一次有关恢复文件的提示。
加载项使用关闭挂钩删除哨兵并执行几项操作以确保 RunProgram 终止。 可能会留下一些诊断 show() 调用,但您通常看不到它们的输出,因为 JMP 正在关闭。 您可以使用 view->add-ins 来启用/禁用 FileSnapper 并在日志窗口中观察它们。
每五分钟从 RunProgram 调用一次 backup() 函数。 Backup() 查找脏(修改)的编辑器窗口,将其内容与上次比较,如果更改则保存副本。 在 Documents 下为快照创建一个特殊文件夹。 这些文件被标记为只读以帮助您不要尝试使用它们,因为...
每次 FileSnapper 启动时,它都会研究旧的快照文件。 FileSnapper 会悄悄删除旧快照。 您可以控制日志的噪音程度,但您不想让 FileSnapper 记录它创建的每个快照,因为您可能每五分钟丢失一两次击键,而更多的日志活动只会让情况变得更糟。
对话窗口(发生故障后,或从菜单中)显示最新到最旧的快照列表。 您可以 (1) 双击打开,或 (2) 单击选择。 如果您选择一个文件,您可以右键单击所选文件(右键单击不会选择,太糟糕了!)并与现有文件进行比较。如果您选择两个文件,您可以右键单击并比较这两个文件。 检查比较窗口的标题以快速查看文件是否相同。 比较现有文件不提示;它在注册表和一些已识别的目录中查找正确名称的文件。 它可能是也可能不是您要比较的文件。
但我还是丢了一些工作。
在开发脚本时,您经常会按 Escape 来停止脚本。 FileSnapper 是一个脚本。 似乎没有办法阻止它偶尔处理转义键并在错误的时间停止,永远不会在五分钟后再次运行。 FileSnapper 有一个半生不熟的想法,即报告它已停止,但前提是五分钟后打开数据表。 就我而言,我在编写脚本时不经常使用数据表,所以我可能不会得到通知。
有一次,我将保留时间设置为 100 天,将快照频率设置为 30 秒。 这太多了。 有超过 10,000 个文件,JMP 启动可能需要 30 秒。 在对话框的选项中选择您的疼痛程度。 按保存按钮,然后关闭对话框。
我希望将它内置到 JMP 中,并且希望有更好的回调计时器。 可以进行很多改进(例如对话框中的保存按钮不提供任何反馈)。 它可能会或可能不会真正帮助某人。 如果您厌倦了偶尔错过的击键,您可以将其卸载。 同样的 view->add-ins 菜单也可以让你查看源代码。 谢谢@贾斯汀_奇尔顿用于指出项目中的 JSL 窗口是如何工作的。
加入。
我真的很喜欢这里的环境运行前自动保存。
- 在 JSL 调试期间,我可以确保每隔几分钟保存一次 JSL 代码(每次尝试使其运行)
- 将 JSL 文件保存在云中允许我获取以前版本的代码 - 以防万一最后一个版本不正常......
