<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich sehe einen früheren Thread dazu, der ähnlich ist ...
Meine Batchdatei sieht genauso aus,
so was:
„C:\Programme\SAS\JMP\9\jmp.exe“ „C:\SCHEDULED\MYSCRIPT.jsl“
aber ich habe bereits exit(nosave); am Ende meines Skripts (und habe alle Tabellen und Fenster geschlossen).Und wenn ich die .bat-Datei einfach durch Anklicken ausführe, öffnet sie JMP, führt das Skript aus und wird dann ordnungsgemäß beendet.Erst wenn ich diese .bat-Datei über den Taskplaner ausführe, stimmt etwas nicht.Es scheint, dass die Funktion „exit()“ nicht ausgeführt wird.Das Skript wird ausgeführt und erledigt seine Aufgabe, aber eine jmp.exe bleibt offen – ich kann sie im Task-Manager sehen, obwohl sie ansonsten unsichtbar ist, und die Aufgabe wird nicht fortgesetzt (der Scheduler sagt nicht, dass sie abgeschlossen ist, sondern wartet bis zur eingestellten maximalen Zeit und beendet die Aufgabe). Der Effekt ist also, dass meine automatisierten Skripte ihre Arbeit erledigen, aber mit der Zeit sind immer mehr JMPs geöffnet, bis ich einen Speicherfehler erhalte (und wenn ich in den Scheduler-Verlauf schaue, werden meine Jobs nie erfolgreich abgeschlossen, sie werden alle nach einer Stunde oder... beendet). was auch immer).Ich habe versucht, JMP mit tskill in der bat-Datei zu schließen, aber das hat nicht geholfen, vermutlich weil es nie zu diesem Schritt kommt.
Ich habe auch festgestellt, dass ich den Planer glücklich machen kann, indem ich die Batch-Datei wie folgt ändere:
start „“ „C:\Programme\SAS\JMP\9\jmp.exe“ „C:\SCHEDULED\MYSCRIPT.jsl“.Dann wartet es nicht fruchtlos darauf, dass die Sache zu Ende ist, der Scheduler denkt, dass es erledigt ist, nachdem die .bat-Datei gestartet wurde, aber ich habe immer noch offene JMP-Prozesse.Ich kann immer noch nicht herausfinden, wie ich JMP erfolgreich schließen kann, wenn ich es im Scheduler öffne.Vielleicht kann ich täglich eine Aufgabe ausführen, die zu einer ungeraden Stunde, wenn ich nicht erwarte, dass etwas Nützliches ausgeführt wird, auf allen offenen JMPs die Aufgabe beendet.Aber ich hoffe auf eine sauberere Lösung.
Irgendwelche Gedanken dazu?
Dies ist JMP9 und Windows7. Und das passiert bei einer Vielzahl verschiedener JSL-Skripte, die scheinbar alle ihre Aufgaben bis zum Beenden von JMP abschließen (und JMP auch außerhalb des Schedulers beenden).
Ich habe das gleiche Problem wie beschrieben beobachtet. Aber ich habe eine sehr einfache Lösung gefunden.
Mir ist aufgefallen, dass ich, wenn ich JMP interaktiv ausführe und es schließe, wenn Dateien geöffnet sind (z. B. Skripte), immer ein Dialogfeld „Sitzung speichern“ erhalte, in dem ich gefragt werde: „Soll JMP sich die geöffneten Dateien und Berichte merken?“ und sie das nächste Mal wieder öffnen?“
Es gibt die Schaltflächen „Ja“, „Nein“ und „Abbrechen“ sowie ein Kontrollkästchen für „Nicht erneut nach dem Speichern der Sitzung fragen“.
Ich vermutete, dass dieser Dialog auch im Batch-Modus erscheint und JMP dort auf eine Antwort wartet.
Also habe ich das Kästchen „Nicht mehr fragen“ aktiviert und JMP geschlossen.
Dann habe ich meinen Batch-Job manuell im Taskplaner ausgelöst ... und was Sie wissen, er wurde erfolgreich ausgeführt und ordnungsgemäß beendet, wobei im Taskplaner „Der Vorgang erfolgreich abgeschlossen“ vermerkt wurde.
Ich habe keine ursächliche Lösung für das Problem gefunden.Aber Sie sind nicht der Einzige, der mir sagt, dass „exit()“ nicht immer funktioniert.Ich habe jetzt jedoch einen Workaround.
Dafür musste ich meinen Mann, einen echten Programmierer, engagieren.Jetzt schulde ich ihm eine Bananen-Sahne-Torte.
Dieses kleine Powershell-Programm löst tatsächlich ein weiteres JMP-spezifisches Problem, das für jemanden von Interesse sein könnte.Eines meiner Skripte möchte eine HTML-Adresse öffnen und von dort tabellarische Informationen abrufen.ABER der Standort ist passwortgeschützt.Ich konnte für JMP keine Möglichkeit finden, meine Anmeldeinformationen an eine Website in JSL weiterzugeben, es schlägt einfach fehl.Es funktioniert jedoch einfach ohne die Anmeldeinformationen wenn ich die Website kürzlich geöffnet und die Anmeldeinformationen im Internet Explorer eingegeben habe .JMP scheint die IE-Cookies zu verwenden.Das ist jedenfalls der Grund, warum dieses Programm über eine Befehlszeilenoption namens „loginpage“ verfügt.Es ist überflüssig für das JMP-Beendigungsproblem, öffnet aber optional den IE auf einer bestimmten Webseite, übergibt bei Bedarf die fest codierten Anmeldeinformationen und schließt dann den IE.
„waitforlog“ IST relevant.Die Funktionsweise dieses Schemas besteht darin, dass das JMP-Skript bei der Ausführung am Ende eine bestimmte Protokolldatei veröffentlicht, wenn es fertig ist.Im Gegensatz zu exit() scheint dies zuverlässig zu geschehen.Dieses Programm löscht alle früheren Versionen dieser Datei, öffnet JMP, führt das Skript aus und wartet dann, bis die Datei wieder angezeigt wird.Wenn dies der Fall ist, weiß es, dass es JMP beenden kann und hat die Prozess-ID der JMP-Instanz ermittelt, die es geöffnet hat, und beendet nur diese Instanz.
Ich hatte eine frühere Problemumgehung mit Taskkill, um alle geöffneten JMPs regelmäßig zu beenden, aber es scheint, dass es in einer einfachen Batchdatei nicht einfach ist, zu wissen, welche bestimmte Instanz Sie gerade gestartet haben, damit Sie diese bestimmte Instanz mit Taskkill beenden können.Da ich viele geplante Jobs habe und diesen Computer auch zum Öffnen von JMP und zum Erledigen einiger manueller Arbeiten verwenden möchte, während die Jobs im Hintergrund ausgeführt werden, war es keine sehr gute Lösung, JMP-Instanzen einfach so zu töten.Powershell scheint über die besondere Fähigkeit zu verfügen, eine bestimmte Instanz eines gerade gestarteten Programms zu identifizieren.
Wie auch immer, diese Powershell-Lösung funktioniert jetzt für mich, für beide Probleme ...
Hier ist ein Beispiel für die Syntax in einer .bat-Datei, in der es ausgeführt wird ... (wobei die letzten beiden Dinge optional sind)
powershell „&“C:\SCHEDULED\runJMPscript. ps1" -script 'C:\SCHEDULED\yourJSLscript.JSL' -waitforlog -loginpage
Wie gesagt, ich habe das nicht selbst geschrieben und der Login-Teil basiert auf etwas, das ich in einem anderen Forum darüber gefunden habe, wie man den IE startet und ihn dazu bringt, mehr Dinge zu tun, die nur in einer einfachen Batch-Datei möglich wären.Dennoch ist es einigermaßen verständlich.Beachten Sie, dass der Speicherort von JMP dort fest codiert ist und Sie Ihr Skript ändern müssen, damit es die Protokolldatei mit dem Namen erstellt, der dem Skriptnamen mit der Erweiterung .log entspricht.
#******************************************************* **************************
#
# RunJmpScript.ps1 – PowerShell-Skript zum Ausführen eines Jmp-Befehls
#
# Verwendung:
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script Skriptname [-waitforlog]
#
#******************************************************* **************************
param ([switch]$loginpage, [string]$script = "unknown", [switch]$waitforlog)
#
# Überprüfen Sie die Befehlszeilenoptionen auf Fehler
#
Write-Host „loginpage: $loginpage“
Write-Host „script: $script“
Write-Host „waitforlog: $waitforlog“
$scriptexists = (Test-Path $script -PathType Leaf)
if (!($scriptexists))
{
Write-Host „Fehler: Der Speicherort einer Jmp-Skriptdatei muss mit -script angegeben werden.“
Ausgang 1
}
#
# Rufen Sie bei Bedarf die Informationen zur Anmeldeseite ab
#
if ($loginpage)
{
# Definieren Sie einige Variablen, die sich je nach Konfiguration ändern
# Ich empfehle, diese als XML-Datei zu speichern und sie bei der Ausführung einzulesen
# Zeit, aber um dieser Übung willen halte ich es einfach.
$username = "Benutzernamen hier eingeben"
$password = "Passwort hier eingeben"
$url = "URL hier eingeben"
# Erstellen Sie das IE-COM-Objekt
$ie = neues-Objekt -com InternetExplorer.Application
# Navigieren Sie zur Anmeldeseite
$ie.navigate($url)
# Warten Sie, bis die Seite vollständig geladen ist
mache {sleep 1} bis (-not ($ie.Busy))
#$ie.visible = $true #Kommentieren Sie dies zum Debuggen aus
# Weisen Sie das DOM der Variablen $doc zu
$doc = $ie.document
# Geben Sie die Anmeldeinformationen ein
versuchen {
# Suchen Sie das Feld „Benutzername“ und setzen Sie den Wert auf den unserer Variablen
$usernameField = $doc.getElementById('USER')
$usernameField.value = $username
# Suchen Sie das Passwortfeld und setzen Sie den Wert auf den des Ergebnisses
# eines Aufrufs der Funktion „Get-Password“ mit dem oben definierten Parameter
$passwordField = $doc.getElementById('PASSWORD')
$passwordField.value = $password
# Suchen Sie die Schaltfläche „Senden“ und klicken Sie darauf
$submitButton = $doc.getElementById('Submit')
$submitButton.click()
# Warten Sie, bis die Anmeldung abgeschlossen ist
mache {sleep 1} bis (-not ($ie.Busy))
} {$null} fangen
# Warten Sie, bis die Seite vollständig geladen ist
mache {sleep 1} bis (-not ($ie.Busy))
# IE schließen
$ie.quit()
}
#
# Entfernen Sie die aktuelle Protokolldatei, wenn wir sie überwachen wollen
#
$logfile = $script + „.log“
if ($waitforlog)
{
if (Test-Path $logfile -PathType Leaf)
{
Write-Host „Vorhandene Protokolldatei $logfile entfernen“
Remove-Item $logfile
}
}
#
# Führen Sie den Jmp-Befehl mit dem angegebenen Skript aus
#
$exe = "C:\Programme\SAS\JMP\9\jmp.exe"
$exeargs = "`"" + $script + "`""
Write-Host „Prozess $exe mit Argument starten: $exeargs“
$jmp = start-process $exe „$exeargs“ -passthru
#
# Sehen Sie, ob wir darauf warten müssen, um eine Protokolldatei zu schreiben.
#
if ($waitforlog)
{
$logfile = $script + „.log“
$idval = $jmp.Id
Write-Host „Warten auf Protokolldatei $logfile vom Prozess $idval“
while (!(Test-Path $Logfile -PathType Leaf))
{
# Wenn der Prozess beendet wird, können wir ihn jetzt einfach beenden
if ($jmp.HasExited)
{
Ausgang 0
}
# Andernfalls warten Sie einen Moment und versuchen Sie es erneut
Start-Sleep -s 1
}
Write-Host „Externes Programm $idval stoppen“
Stop-Prozess $idval
}
Ausgang 0
Ich hatte ähnliche Probleme mit der Verwendung des Befehls „exit(nosave)“ auch bei Verwendung des Taskplaners. Wenn ich das JSL-Skript in JMP ausführe, funktioniert es einwandfrei.
Ich habe noch nie gesehen, dass es tatsächlich nicht geschlossen wurde, aber ich habe die folgenden zwei Ergebnisse erhalten (gleiches Skript, verschiedene Maschinen):
1) Das Programm wird wie vorgesehen geschlossen
2) Ich erhalte eine „JMP-Ausnahme!“ Warnfenster, das besagt, dass JMP eine Zugriffsverletzung begangen hat und heruntergefahren wird.Fehlerinformationen werden in JMPExcept.jer im Ordner „Meine Dokumente“ oder im lokalen Anwendungsdatenordner des Benutzers kopiert, wenn dies nicht möglich ist.Die Fehlerinformationen können bei Bedarf per E-Mail an den technischen Support von JMP gesendet werden.
In meinem Fall erhalte ich diese Ergebnisse auch, wenn ich die Bat-Datei ausführe, aber wenn ich das JSL-Skript normal über JMP ausführe, funktioniert es jedes Mal.
Ich habe auch tatsächlich gesehen, dass es manchmal auf demselben Computer funktioniert und bei anderen nicht.
Wenn jemand andere Erfahrungen (oder Workarounds) hat, würde ich gerne davon hören.Ich habe tatsächlich eine E-Mail an den JMP-Support geschickt und sie wussten spontan nicht, warum das Verhalten anders war.