如何捕获对打开文件的写入尝试?您好 - 我有一个 JSL 脚本,提示用户将刚刚通过分析生成的 JMP 图形选择直接保存到 PowerPoint 演示文稿中。用户可能想立即检查生成的幻灯片,所以我不想自动关闭 PowerPoint 文件 - 但如果用户随后尝试附加任何更多的第二次运行脚本时,他们会收到一个 JMP 警报,告诉他们他们正在尝试覆盖可能在另一个程序中打开的文件(当然它是)。
我已经尝试使用 Try() 函数捕获可能会失败的尝试,但这似乎不起作用:无论如何都会发生错误 - 尽管 JMP 警报确实正确地告诉用户问题是什么,但我没有真的想要中断程序流程的错误消息。我认为使用“Is File Writable()”函数提前检查它会处理它,但这似乎也不起作用:PowerPoint 文件是被认为是可写的,即使它是开放的。
目前我正在屏幕上显示一条消息 - 如果文件已经存在(显然我能够检查) - 提前警告用户如果它是打开的,他们需要在继续之前关闭它——但这有点不雅,并不能真正解决问题。有没有办法自动(a)检查它是否尚未打开,以及(b)在必要时关闭它?
图形脚本回复:我如何捕获试图写入打开文件的尝试?非常感谢 Jim 和 Craige - 我现在有一个可行的解决方案,它是您的建议的结合。我不得不使用“Batch Interactive”命令,因为 JMP 警报没有被发送到日志,但我无法让 logcapture() 命令工作,而 << get log() 做了我需要的。
我注意到每次都必须清除日志,否则每次后续运行都会收到相同的错误消息。仅作记录,我在下面包含了我的最终脚本的精简版本。(我猜第二个“Batch Interactive(bi) 术语再次打开交互式 JMP 警报 - 是吗?)”
OutputFileName = "$DESKTOP\My Slides.pptx";
if(not(file exists(OutputFileName)),
// No possible problem here;
Text Box("New File - First Page") << save presentation(OutputFileName);
caption("You've just started a new presentation - here it is..."); wait(2); caption(remove);
open(OutputFileName)
,
// The file exists but it might be open - so be wary;
bi = Batch Interactive( 1 );
// If I don't clear the log first, it will tell me there's an error even when there isn't;
clear log();
Text Box("Existing File - Next Page") << save presentation(OutputFileName, append);
Error_List = get log();
if(contains(concat items(Error_List), "Unable to overwrite"),
beep();
caption("You can't write to the file\!rbecause it's open right now.\!rPlease close it, then try again.");
wait(3);
caption(remove);
Batch Interactive(bi)
,
caption("Here's the updated presentation with your latest slide"); wait(2); caption(remove);
open(OutputFileName)
)
);回复:我如何捕获试图写入打开文件的尝试?txt = logcapture(...jsl that might make log messages...)
也可以用同样的方法来帮助。
编辑:你可能需要创建数据库连接错误同样,它展示了如何使用 BatchInteractive() 来抑制对话框并仅获取日志消息。 ...和有关批处理交互的更多信息.
回复:我如何捕获试图写入打开文件的尝试?您可以使用
mylist = get log();
然后通过 mylist 解析以查看警告是否发生,如果发生,则采取您想要采取的措施。