如何捕獲對打開文件的寫入嘗試?您好 - 我有一個 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 解析以查看警告是否發生,如果發生,則採取您想要採取的措施。