<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />これに関する過去のスレッドにも同様の内容があったのですが...
私のバッチファイルは同じように見えますが、
このような:
"C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl"
しかし、私はすでに exit(nosave) を持っています。スクリプトの最後に(そしてすべてのテーブルとウィンドウを閉じました)。また、.bat ファイルをクリックするだけで実行すると、JMP が開き、スクリプトが実行され、正常に終了します。問題が発生するのは、タスク スケジューラを通じてこの .bat ファイルを実行した場合のみです。exit() を実行していないようです。スクリプトは実行され、その処理を実行しますが、jmp.exe は開いたままです。タスク マネージャーでは表示されますが、それ以外の場合は表示されず、タスクは先に進みません (スケジューラーは完了を通知せず、待機します)設定された最大時間まで待機し、タスクを終了します)。その結果、自動化されたスクリプトは作業を完了していますが、時間の経過とともにメモリ エラーが発生するまで開かれる JMP が増えていきます (スケジューラの履歴を見ると、ジョブが正常に終了することはありません)。1 時間以内にすべて終了します。何でも)。バットファイルで tskill を使用して JMP を閉じようとしましたが、おそらくそのステップに到達しないため、役に立ちませんでした。
また、バッチ ファイルを次のように変更すると、スケジューラを満足させることができることもわかりました。
"" "C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl" を起動します。その後、処理が終了するまで無駄に待つことはなく、スケジューラは .bat ファイルの起動後に処理が完了したと認識しますが、JMP プロセスはまだ開いたままになっています。スケジューラーで JMP を開いたときに正常に閉じる方法がまだわかりません。おそらく、有用なものが何も実行されていないと思われる奇妙な時間に、開いているすべての JMP でタスクを強制終了するだけのタスクを毎日実行できるかもしれません。しかし、私はよりクリーンな解決策を期待しています。
これについて何か考えはありますか?
JMP9とWindows7です。また、この問題はさまざまな JSL スクリプトで発生し、そのすべてが JMP を終了する時点までタスクを完了しているように見えます (スケジューラの外部で JMP を終了します)。
説明されているのと同じ問題を確認しました。 しかし、非常に簡単な解決策を見つけました。
JMP を対話的に実行するときに、開いているファイル (スクリプトなど) がある場合に JMP を閉じると、常に「セッションの保存」ダイアログが表示され、「開いているファイルとレポートを JMP に記憶させますか?」と尋ねられることに気づきました。次回また開きますか?」
[はい]、[いいえ]、[キャンセル] ボタンと、[セッションの保存について再度質問しない] チェック ボックスがあります。
このダイアログはバッチ モードでも表示されており、JMP がそこで応答を待っているのではないかと考えました。
そこで、「今後は質問しない」ボックスにチェックを入れて、JMP を閉じました。
次に、タスク スケジューラでバッチ ジョブを手動でトリガーしました。なんと、ジョブは正常に実行され、タスク スケジューラに「操作は正常に完了しました」と表示されて適切に終了しました。
この問題の根本原因の解決策が見つかりませんでした。しかし、exit() が常に機能するとは限らないと私に言ったのはあなただけではありません。ただし、今は回避策があります。
これについては、本物のプログラマーである夫に協力してもらう必要がありました。今私は彼にバナナクリームパイの借りがあります。
この小さな Powershell プログラムは、実際には、誰かが興味を持つかもしれない別の JMP 固有の問題を解決します。私のスクリプトの 1 つは、HTML アドレスを開いて、そこから表形式の情報を取得したいと考えています。ただし、その場所はパスワードで保護されています。JMP が資格情報を JSL の Web サイトに渡す方法が見つかりませんでした。失敗するだけです。ただし、認証情報がなくても機能します最近サイトを開いて Internet Explorer で資格情報を入力した場合。JMP は IE Cookie を使用しているようです。とにかく、それが、このプログラムに「loginpage」と呼ばれるコマンド ライン オプションがある理由です。これは JMP の終了問題には不要ですが、オプションで特定の Web ページで IE を開き、必要に応じてハードコードされた資格情報を渡し、その後 IE を閉じます。
「waitforlog」が関係します。このスキームの仕組みは、JMP スクリプトの実行時に、完了時に特定のログ ファイルを最後に投稿することです。exit() とは異なり、これは確実に発生するようです。このプログラムは、そのファイルの以前のバージョンを削除し、JMP を開いてスクリプトを実行し、ファイルが再表示されるのを待ちます。実行すると、JMP を強制終了できることがわかり、開いた JMP のインスタンスのプロセス ID が計算され、そのインスタンスのみが強制終了されます。
以前の回避策として、taskkill を使用して開いているすべての JMP を定期的に強制終了する方法がありましたが、単純なバッチ ファイルでは、起動したばかりの特定のインスタンスを把握して、taskkill でその特定のインスタンスを強制終了するのは簡単ではないようです。私にはスケジュールされたジョブが多数あり、このマシンを使用して JMP を開いて、ジョブがバックグラウンドで実行されている間に手動作業を行いたいと考えているため、JMP インスタンスをむやみやたらに強制終了するのはあまり良い解決策ではありませんでした。Powershell には、開始したばかりのプログラムの特定のインスタンスを識別する特別な機能があるようです。
とにかく、この Powershell ソリューションは、両方の問題について、今ではうまく機能しています。
これを実行する .bat ファイルの構文の例を次に示します。(最後の 2 つはオプションです)
powershell "&"C:\SCHEDULED\runJMPscript。 ps1" -script 'C:\SCHEDULED\yourJSLscript.JSL' -waitforlog -loginpage
先ほども言いましたが、これは私が自分で書いたものではなく、ログイン部分は、IE を起動して、単純なバッチ ファイルで可能だったより多くのことを IE に実行させる方法について、別のフォーラムで見つけたものに基づいています。それでも、かなりわかりやすいです。JMP の場所はそこにハードコーディングされているため、スクリプト名に .log 拡張子を付けた名前でログ ファイルを作成するようにスクリプトを変更する必要があることに注意してください。
#************************************************ ****************************
#
# RunJmpScript.ps1 - Jmp コマンドの実行に使用される PowerShell スクリプト
#
# 使用法:
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script スクリプト名 [-waitforlog]
#
#************************************************ ****************************
param ([switch]$loginpage, [string]$script = "unknown", [switch]$waitforlog)
#
# コマンドライン オプションでエラーを確認する
#
書き込みホスト「ログインページ: $loginpage」
書き込みホスト「スクリプト: $script」
書き込みホスト「waitforlog: $waitforlog」
$scriptexists = (テストパス $script -PathType リーフ)
if (!($scriptexists))
{
Write-Host "エラー: -script <パス> を使用して Jmp スクリプト ファイルの場所を指定する必要があります"
出口1
}
#
# 必要に応じてログインページ情報を取得します
#
if ($loginpage)
{
# 設定に基づいて変更される変数をいくつか定義します
# これらを XML ファイルに保存し、実行時に読み込むことをお勧めします
# 時間がかかりますが、この練習のために簡単にしておきます。
$username = "ここにユーザー名を入力してください"
$password = "ここにパスワードを入力してください"
$url = "ここにURLを入力してください"
# IE com オブジェクトを作成する
$ie = 新しいオブジェクト -com InternetExplorer.Application
# ログインページに移動します
$ie.navigate($url)
# ページの読み込みが完了するまで待ちます
(-not ($ie.Busy)) まで {sleep 1} を実行します
#$ie.visible = $true #デバッグのためにこれのコメントを解除します
# DOM を $doc 変数に割り当てます
$doc = $ie.document
# ログイン情報を入力します
試す {
# ユーザー名フィールドを見つけて、値を変数の値に設定します
$usernameField = $doc.getElementById('USER')
$usernameField.value = $username
# パスワードフィールドを検索し、その値を結果の値に設定します
先頭にパラメータが定義された get-password 関数の呼び出しの #
$passwordField = $doc.getElementById('PASSWORD')
$passwordField.value = $password
# 送信ボタンを見つけてクリックします
$submitButton = $doc.getElementById('送信')
$submitButton.click()
# ログインが完了するまで待ちます
(-not ($ie.Busy)) まで {sleep 1} を実行します
} {$null} をキャッチします
# ページの読み込みが完了するまで待ちます
(-not ($ie.Busy)) まで {sleep 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 (!(Test-Path $Logfile -PathType Leaf))
{
# プロセスが終了した場合は、すぐに終了できます
if ($jmp.HasExited)
{
0番出口
}
# それ以外の場合は、少し待ってから再試行してください
スタート-スリープ -s 1
}
Write-Host "外部プログラム $idval を停止しています"
プロセス $idval の停止
}
0番出口
タスクスケジューラを使用するときに exit(nosave) コマンドを使用する場合にも同様の問題が発生しました...JMP で jsl スクリプトを実行すると、正常に動作します。
これまで実際に閉じていないのを見たことがありませんでしたが、次の 2 つの結果が得られました (同じスクリプト、異なるマシン)。
1) プログラムが正常に終了する
2) 「JMP 例外!」が発生します。 JMP がアクセス違反を行ったのでシャットダウンすることを示す警告ウィンドウ。それが不可能な場合、エラー情報は My dcouments フォルダまたはユーザーのローカル アプリケーション データ フォルダの JMPExcept.jer にコピーされます。必要に応じて、エラー情報を JMP テクニカル サポートに電子メールで送信できます。
私の場合、batファイルを実行したときにもこれらの結果が得られましたが、JMPからJSLスクリプトを通常に実行すると、毎回機能します。
また、同じマシン上で、時々動作する場合とそうでない場合があることを実際に確認しました。
他に何か経験(または回避策)がある人がいたら、それについて聞きたいです。実際に JMP サポートに電子メールを送信しましたが、彼らはなぜ動作が異なるのか分かりませんでした。