如何捕獲寫入打開文件的嘗試?嗨 - 我有一個 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)
)
);