我正在運行 Windows 7,JMP 版本 12、13、14 和 15。
我正在使用包含順序執行其他從屬/嵌套腳本的代碼的“包裝器”腳本觀察 JMP15 中的問題。
這些腳本是用 pre-15 版本編寫的,並且可以在那裡正常運行。這些包裝器/嵌套腳本集合中的一些(但不是全部)無法在 JMP15 中正確運行。
如果單獨運行,每個單獨的腳本都能在 JMP15 中正確運行。
對於無法提交完整的腳本集,我深表歉意,但我已經提供了這兩種類型的通用示例。
'wrapper' 腳本是通用形式:
//start wrapper.jsl
names default to here(1);
close all (data tables, no save);
clear log();
subordinate_scripts = {"subord1.jsl","subord2.jsl","subord3.jsl","subord4.jsl"};
for( i = 1, i <= n items(subordinate_scripts), i++,
beacon = 1; //variable gets set to 0 by last line of subordinate script
open(subordinate_scripts[i]);
if(beacon !=0,
write("\!NScript "||subordinate_scripts[i]||" did not successfully execute to completion.";
throw();
);
);
//end wrapper.jsl嵌套腳本 subord1.jsl 等具有通用形式
//! //start subord script so it will auto-execute when opened by wrapper.jsl
/* bunch of stuff, e.g.
aggregating multiple files
database queries
data processing / reshaping
saving large files
building extensive reports in the journal
executing other scripts
*/
beacon = 0;
//end subord script
從屬腳本通過將 beacon 的值更改為 0 作為其最後一條指令,向包裝器腳本發出完成執行信號。
如果beacon == 0,包裝腳本開始FOR循環的下一個循環,打開下一個從屬腳本。
我在 JMP15 中看到的表明以下事件順序:
- 包裝腳本開始
- 信標設置為 1
- 第一個從屬腳本開始
- 包裝腳本不等待從屬腳本完成。
- 包裝腳本執行繼續到 IF 語句。
- 信標==1
- 打印消息說從屬腳本失敗(注意此時從屬腳本已經在運行)
- 包裝腳本停止
- 從屬腳本成功執行完畢。
- 下一個從屬腳本未打開,因為包裝器已停止
JMP15 之前的版本中通常的事件順序是
- 包裝器開始
- 包裝器設置信標 = 1
- 包裝器打開下級腳本,然後空閒直到下級腳本完成
- 從屬腳本運行,將 beacon = 0 設置為最後一條指令
- 包裝器腳本檢查信標值。
- 由於beacon ==0,執行FOR循環的下一個循環。
- 所有下級腳本依次運行。
有沒有人建議讓這個腳本習慣用法在 JMP15 中工作?
先感謝您。
謝謝你的回應,克雷奇。我將實施更多好的建議。非常感激。
我猜:信標變量有時是子腳本的本地變量。 也許涉及 NamesDefaultToHere。 快速測試表明 JMP 15做honor NamesDefaultToHere 當 JMP 14 沒有時,它使信標成為子腳本的本地。@EvanMcCorkle @Audrey_Shull
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);像文斯一樣,我會用包括()而不是打開()為此,因為它不需要 //! .
您還可以使用 ::beacon 使其成為全局變量。
或者從擁有它的子腳本中刪除 NamesDefaultToHere。
為什麼 open() 和 include() 不再可以互換?