Windows 7, JMP 버전 12, 13, 14 및 15를 실행하고 있습니다.
JMP15에서 다른 하위 / 중첩 스크립트를 순차적으로 실행하는 코드가 포함 된 '래퍼'스크립트와 관련된 문제가 발생했습니다.
이 스크립트는 15 이전 버전으로 작성되었으며 제대로 실행됩니다. 이러한 랩퍼 / 중첩 된 스크립트 콜렉션 중 일부 (일부는 아님)가 JMP15에서 올바르게 실행되지 않습니다.
개별적으로 실행되는 경우 별도의 스크립트 각각이 JMP15에서 올바르게 실행됩니다.
전체 스크립트 세트를 제출할 수 없어서 죄송하지만 두 가지 유형의 일반적인 예를 제공했습니다.
'래퍼'스크립트는 일반적인 형식입니다.
//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
하위 스크립트는 마지막 명령으로 비콘의 값을 0으로 변경하여 래퍼 스크립트에 대한 실행을 완료합니다.
beacon == 0 인 경우 랩퍼 스크립트는 FOR 루프의 다음주기를 시작하고 다음 하위 스크립트를 엽니 다.
JMP15에서 본 것은 다음과 같은 순서의 이벤트를 제안합니다.
- 랩퍼 스크립트가 시작됩니다
- 비콘을 1로 설정
- 첫 번째 하위 스크립트가 시작됩니다
- 랩퍼 스크립트는 종속 스크립트가 완료 될 때까지 기다리지 않습니다.
- 랩퍼 스크립트 실행은 IF 문으로 계속됩니다.
- 비콘 == 1
- 하위 스크립트가 실패했다는 메시지가 인쇄됩니다 (이 시점에서 하위 스크립트가 이미 실행되고 있음에 유의하십시오)
- 랩퍼 스크립트 중지
- 하위 스크립트가 성공적으로 실행됩니다.
- 랩퍼가 중지되었으므로 다음 하위 스크립트가 열리지 않습니다.
JMP15 이전 버전의 일반적인 이벤트 순서는 다음과 같습니다.
- 래퍼 시작
- 랩퍼 세트 비콘 = 1
- 래퍼는 하위 스크립트를 연 다음 하위 스크립트가 완료 될 때까지 유휴 상태입니다.
- 하위 스크립트 실행, 마지막 명령으로 비콘 = 0 설정
- 랩퍼 스크립트는 비콘 값을 확인합니다.
- 비콘 == 0이므로 FOR 루프의 다음 사이클이 실행됩니다.
- 모든 하위 스크립트가 순차적으로 실행됩니다.
JMP15에서이 스크립팅 관용구가 작동하도록 제안하는 사람이 있습니까?
미리 감사드립니다.
open ()과 include ()가 더 이상 호환되지 않는 이유가 있습니까?
짐작할 것입니다 : 비콘 변수는 때때로 하위 스크립트에 국한됩니다. 아마도 NamesDefaultToHere가 관련되었을 것입니다. 빠른 테스트는 JMP 15가 않습니다 honor NamesDefaultToHere JMP 14가 아닌 경우 비콘을 하위 스크립트에 로컬로 만듭니다. @EvanMcCorkle audrey
file=savetextfile("$temp/xxx.jsl","//!
namesdefaulttohere(1);
xyzzy=42;show(xyzzy)");
open(file);
show(xyzzy);빈스처럼 포함() 오히려 열다() // 필요하지 않기 때문에 이것을 위해! .
:: beacon을 사용하여 전역 변수로 만들 수도 있습니다.
또는 하위 스크립트에서 NamesDefaultToHere를 제거하십시오.
답변 감사합니다, 크레이그 내가 구현할 더 좋은 조언. 매우 감사.