<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />비슷한 내용의 이전 스레드를 본 적이 있습니다.
내 배치 파일은 동일해 보입니다.
이와 같이:
"C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl"
하지만 이미 종료(nosave)가 있습니다. 내 스크립트 끝에서 (그리고 모든 테이블과 창을 닫았습니다).그리고 .bat 파일을 클릭해서 실행하면 JMP가 열리고 스크립트가 실행된 다음 정상적으로 종료됩니다.작업 스케줄러를 통해 이 .bat 파일을 실행할 때만 문제가 발생합니다.Exit()를 수행하지 않는 것 같습니다.스크립트는 실행되고 해당 작업을 수행하지만 jmp.exe는 열려 있습니다. 그렇지 않으면 보이지 않지만 작업 관리자에서 볼 수 있으며 작업이 진행되지 않습니다(스케줄러는 완료되었다고 말하지 않고 기다립니다) 설정된 최대 시간까지 작업을 종료합니다). 따라서 자동화된 스크립트가 작업을 완료하지만 시간이 지남에 따라 메모리 오류가 발생할 때까지 점점 더 많은 JMP가 열려 있습니다. 그리고 스케줄러 기록을 보면 작업이 성공적으로 끝나지 않으면 한 시간 또는 한 시간 후에 모두 종료됩니다. 무엇이든).JMP를 닫기 위해 bat 파일에서 tskill을 사용해 보았지만 도움이 되지 않았습니다. 아마도 해당 단계에 도달하지 못했기 때문일 것입니다.
또한 배치 파일을 다음과 같이 수정하면 스케줄러를 만족시킬 수 있다는 것을 알았습니다.
"" "C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl"을 시작합니다.그런 다음 작업이 끝날 때까지 기다리지 않고 스케줄러는 .bat 파일을 시작한 후 완료되었다고 생각하지만 여전히 JMP 프로세스가 열려 있습니다.스케줄러에서 JMP를 열 때 JMP를 성공적으로 닫는 방법을 아직도 알 수 없습니다.아마도 유용한 작업이 실행될 것으로 예상되지 않는 이상한 시간에 열려 있는 모든 JMP에서 작업을 종료하는 작업을 매일 실행할 수 있을 것입니다.그러나 나는 더 깨끗한 해결책을 기대하고 있습니다.
이것에 대해 어떤 생각이 있나요?
JMP9과 Windows7입니다. 그리고 이는 다양한 JSL 스크립트에서 발생하며, 모두 JMP 종료 시점까지 작업을 완료하는 것처럼 보입니다(그리고 스케줄러 외부에서 JMP를 종료합니다).
설명된 것과 동일한 문제를 관찰했습니다. 그러나 나는 매우 간단한 해결책을 찾았습니다.
JMP를 대화형으로 실행할 때 열려 있는 파일(예: 스크립트)이 있으면 JMP를 닫을 때 항상 "JMP에서 열린 파일과 보고서를 기억하도록 하시겠습니까?"라고 묻는 "세션 저장" 대화 상자가 표시된다는 점을 발견했습니다. 다음에 다시 열까요?"
예, 아니오, 취소 버튼과 "세션 저장에 대해 다시 묻지 않음" 확인란이 있습니다.
나는 이 대화 상자가 배치 모드에서도 나타나고 JMP가 응답을 기다리고 있는 것으로 의심했습니다.
그래서 "다시 묻지 않음" 상자를 선택하고 JMP를 종료했습니다.
그런 다음 작업 스케줄러에서 배치 작업을 수동으로 트리거했습니다....그리고 아시다시피 작업 스케줄러에 "작업이 성공적으로 완료되었습니다"라는 메시지와 함께 성공적으로 실행되고 올바르게 종료되었습니다.
문제의 근본 원인 해결 방법을 찾지 못했습니다.하지만 나에게 exit()가 항상 작동하지 않는다고 말하는 사람은 당신뿐만이 아닙니다.그러나 지금은 해결 방법이 있습니다.
나는 이것에 대해 실제 프로그래머인 남편을 참여시켜야 했습니다.이제 나는 그에게 바나나 크림 파이를 빚지고 있습니다.
이 작은 Powershell 프로그램은 실제로 누군가가 관심을 가질 수 있는 또 다른 JMP 관련 문제를 해결합니다.내 스크립트 중 하나가 HTML 주소를 열고 거기에서 표 형식의 정보를 얻으려고 합니다.하지만 해당 위치는 비밀번호로 보호되어 있습니다.JMP가 내 자격 증명을 JSL의 웹 사이트에 전달하는 방법을 찾을 수 없었고 실패했습니다.그러나 자격 증명 없이도 작동합니다. 최근에 사이트를 열고 Internet Explorer에 자격 증명을 입력한 경우 .JMP는 IE 쿠키를 사용하는 것 같습니다.어쨌든, 이것이 바로 이 프로그램에 "loginpage"라는 명령줄 옵션이 있는 이유입니다.JMP 종료 문제에는 불필요한 문제이지만 선택적으로 특정 웹 페이지에서 IE를 열고 필요한 경우 하드코딩된 자격 증명을 전달한 다음 IE를 닫습니다.
"waitforlog"가 관련됩니다.이 체계가 작동하는 방식은 JMP 스크립트가 실행될 때 완료되면 마지막에 특정 로그 파일을 게시하는 것입니다.exit()와 달리 이것은 안정적으로 발생하는 것 같습니다.이 프로그램은 해당 파일의 이전 버전을 삭제하고 JMP를 열고 스크립트를 실행한 다음 파일이 다시 나타날 때까지 기다립니다.그렇게 되면 JMP를 종료할 수 있다는 것을 알고 자신이 연 JMP 인스턴스의 프로세스 ID를 알아낸 다음 해당 인스턴스만 종료합니다.
taskkill을 사용하여 열려 있는 모든 JMP를 주기적으로 종료하는 이전 해결 방법이 있었지만 간단한 배치 파일에서는 방금 시작한 특정 인스턴스가 무엇인지 파악하여 taskkill을 사용하여 해당 특정 인스턴스를 종료할 수 있는지 아는 것이 쉽지 않은 것 같습니다.예약된 작업이 많고 이 시스템을 사용하여 JMP를 열고 작업이 백그라운드에서 실행되는 동안 일부 수동 작업을 수행하려고 하므로 JMP 인스턴스를 아무렇게나 종료하는 것은 좋은 솔루션이 아니었습니다.Powershell에는 방금 시작한 프로그램의 특정 인스턴스를 식별하는 특별한 기능이 있는 것 같습니다.
어쨌든 이 Powershell 솔루션은 현재 두 가지 문제 모두에 대해 효과가 있습니다....
다음은 이를 실행하는 .bat 파일의 구문 예입니다....(마지막 두 가지는 선택 사항임)
powershell "&"C:\SCHEDULED\runJMPscript. ps1" -script 'C:\SCHEDULED\yourJSLscript.JSL' -waitforlog -loginpage
내가 말했듯이, 나는 이것을 직접 작성하지 않았으며 로그인 부분은 IE를 시작하고 간단한 배치 파일에서 가능한 더 많은 작업을 수행하도록 하는 것에 대해 다른 포럼에서 찾은 내용을 기반으로 합니다.그래도 꽤 이해가 됩니다.JMP의 위치는 여기에 하드코딩되어 있으며 스크립트 이름이 .log 확장자를 갖는 로그 파일을 생성하도록 스크립트를 변경해야 합니다.
#************************************************ ****************************
#
# RunJmpScript.ps1 - Jmp 명령을 실행하는 데 사용되는 PowerShell 스크립트
#
# 용법:
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script 스크립트 이름 [-waitforlog]
#
#************************************************ ****************************
param ([스위치]$loginpage, [string]$script = "알 수 없음", [스위치]$waitforlog)
#
# 명령줄 옵션에 오류가 있는지 확인하세요.
#
쓰기 호스트 "loginpage: $loginpage"
쓰기 호스트 "스크립트: $script"
쓰기 호스트 "waitforlog: $waitforlog"
$scriptexists = (테스트 경로 $script -PathType 리프)
if (!($scriptexists))
{
Write-Host "오류: -script 를 사용하여 Jmp 스크립트 파일의 위치를 지정해야 합니다."
1번 출구
}
#
# 필요한 경우 로그인 페이지 정보를 검색합니다.
#
if ($로그인페이지)
{
# 구성에 따라 변경될 일부 변수를 정의합니다.
# XML 파일을 저장하고 실행 시 읽는 것을 권장합니다.
# 시간이지만 이 연습을 위해 간단하게 유지하겠습니다.
$username = "여기에 사용자 이름을 입력하세요"
$password = "여기에 비밀번호를 입력하세요"
$url = "여기에 URL을 입력하세요"
# IE com 객체를 생성합니다
$ie = 새 개체 -com InternetExplorer.Application
# 로그인 페이지로 이동
$ie.navigate($url)
# 페이지 로딩이 끝날 때까지 기다립니다.
(-not ($ie.Busy))까지 {잠 1} 자세요
#$ie.visible = $true #디버깅을 위해 주석 처리를 해제합니다.
# $doc 변수에 DOM을 할당합니다.
$doc = $ie.문서
# 로그인 정보를 입력하세요
노력하다 {
# 사용자 이름 필드를 찾아 값을 변수의 값으로 설정합니다.
$usernameField = $doc.getElementById('사용자')
$usernameField.value = $사용자 이름
# 비밀번호 필드를 찾아 결과 값으로 설정
# 맨 위에 정의된 매개변수를 사용하여 get-password 함수에 대한 호출
$passwordField = $doc.getElementById('비밀번호')
$passwordField.value = $password
# 제출 버튼을 찾아서 클릭하세요
$submitButton = $doc.getElementById('제출')
$submitButton.클릭()
# 로그인이 완료될 때까지 기다립니다
(-not ($ie.Busy))까지 {잠 1} 자세요
} {$null} 잡기
# 페이지 로딩이 끝날 때까지 기다립니다.
(-not ($ie.Busy))까지 {잠 1} 자세요
# IE를 닫습니다
$ie.quit()
}
#
# 현재 로그 파일을 모니터링하려면 제거하세요.
#
$logfile = $script + ".log"
if ($waitforlog)
{
if(테스트 경로 $logfile -PathType 리프)
{
Write-Host "기존 로그 파일 $logfile 제거"
항목 제거 $logfile
}
}
#
# 지정된 스크립트를 사용하여 Jmp 명령을 실행합니다.
#
$exe = "C:\Program Files\SAS\JMP\9\jmp.exe"
$exeargs = "`"" + $script + "`""
Write-Host "인수: $exeargs를 사용하여 $exe 프로세스 시작"
$jmp = 시작 프로세스 $exe "$exeargs" -passthru
#
# 로그 파일이 기록될 때까지 기다려야 하는지 확인합니다.
#
if ($waitforlog)
{
$logfile = $script + ".log"
$idval = $jmp.Id
Write-Host "$idval 프로세스에서 $logfile 로그 파일을 기다리는 중"
while (!(테스트 경로 $Logfile -PathType 리프))
{
# 프로세스가 종료되면 지금 종료하면 됩니다.
if ($jmp.HasExited)
{
0번 출구
}
# 그렇지 않으면 잠시 기다렸다가 다시 시도하세요.
시작-수면 -s 1
}
Write-Host "외부 프로그램 $idval 중지 중"
$idval 프로세스 중지
}
0번 출구
작업 스케줄러를 사용할 때에도 exit(nosave) 명령을 사용할 때 비슷한 문제가 있었습니다. JMP에서 jsl 스크립트를 실행하면 제대로 작동합니다.
이전에는 실제로 닫히지 않은 것을 본 적이 없지만 다음 2가지 결과를 얻었습니다(동일한 스크립트, 다른 컴퓨터).
1) 프로그램이 예상대로 종료됩니다.
2) "JMP 예외!"가 발생합니다. JMP가 액세스 위반을 수행하여 종료된다는 경고 창입니다.오류 정보는 내 dcouments 폴더 또는 사용자 로컬 애플리케이션 데이터 폴더의 JMPExcept.jer에 복사됩니다.필요한 경우 오류 정보를 JMP 기술 지원팀에 이메일로 보낼 수 있습니다.
제 경우에는 bat 파일을 실행해도 이런 결과가 나오는데, JMP에서 정상적으로 JSL 스크립트를 실행하면 매번 작동이 되네요.
나는 또한 실제로 동일한 컴퓨터에서 다른 컴퓨터가 작동하지 않고 때로는 작동하는 경우도 보았습니다.
누구든지 다른 경험(또는 해결 방법)이 있으면 그에 대해 듣고 싶습니다.실제로 JMP 지원팀에 이메일을 보냈는데 그들은 왜 동작이 다른지 알지 못했습니다.