如何捕获写入打开文件的尝试?嗨 - 我有一个 JSL 脚本,它提示用户将刚刚通过分析生成的 JMP 图形选择直接保存到 PowerPoint 演示文稿中。用户可能希望立即检查生成的幻灯片,所以我不想自动关闭 PowerPoint 文件 - 但如果用户随后尝试附加任何更多的第二次运行脚本时,他们会收到一个 JMP 警报,告诉他们他们正在尝试覆盖可能在另一个程序中打开的文件(当然是这样)。
我尝试使用 Try() 函数捕获可能失败的尝试,但这似乎不起作用:无论如何都会发生错误 - 尽管 JMP Alert 确实正确地告诉用户问题是什么,但我没有真的希望错误消息中断程序的流程。我认为使用“Is File Writable()”函数提前检查它会处理它,但这似乎也不起作用:PowerPoint文件是被认为是可写的,即使它是打开的。
目前我正在屏幕上显示一条消息 - 如果文件已经存在(显然我能够检查) - 提前警告用户如果它是打开的,他们需要在继续之前将其关闭 - 但这有点不雅,并不能真正解决问题。有没有办法自动(a)检查它是否已经打开,并(b)在必要时关闭它?
图形脚本回复:如何捕获写入打开文件的尝试?您可以使用
mylist = get log();
然后通过 mylist 解析以查看是否发生了警告,如果发生了,则执行您要执行的操作。
回复:如何捕获写入打开文件的尝试?txt = logcapture(...jsl that might make log messages...)
也可以帮助采用相同的方法。
编辑:你可能需要创建数据库连接错误也,它显示了如何使用 BatchInteractive() 来抑制对话框并仅获取日志消息。 ...和更多关于批处理交互.
回复:如何捕获写入打开文件的尝试?非常感谢 Jim 和 Craige - 我现在有了一个可行的解决方案,它融合了您的两个建议。我不得不使用“Batch Interactive”命令,因为 JMP Alert 没有被发送到日志,但我无法让 logcapture() 命令工作,而 << get log() 做了我需要的事情。
我注意到每次都必须清除日志,否则每次后续运行都会收到相同的错误消息。只是为了记录,我在下面包含了我的最终脚本的精简版本。(我猜第二个“Batch Interactive(bi) term 会再次打开交互式 JMP Alert - 是吗?)”
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)
)
);