<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ho visto un thread precedente sull'argomento che è simile...
Il mio file batch sembra lo stesso,
come questo:
"C:\Programmi\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl"
ma ho già exit(nosave); alla fine del mio script (e ho chiuso tutte le tabelle e le finestre).Inoltre, se eseguo il file .bat semplicemente facendo clic su di esso, si apre JMP, viene eseguito lo script e quindi si chiude come dovrebbe.È solo quando eseguo questo file .bat tramite l'Utilità di pianificazione che qualcosa non va.Sembra che non esegua l'exit().Lo script viene eseguito e fa il suo dovere, ma jmp.exe viene lasciato aperto: posso vederlo nel Task Manager anche se altrimenti è invisibile e l'attività non va avanti (lo scheduler non dice che è completo, aspetta fino al tempo massimo impostato e termina l'attività). quindi l'effetto è che i miei script automatizzati stanno portando a termine il loro lavoro ma col tempo sempre più JMP vengono aperti finché non ricevo un errore di memoria (e se guardo nella cronologia dello scheduler i miei lavori non finiscono mai con successo, vengono tutti terminati dopo un'ora o Qualunque cosa).Ho provato a utilizzare tskill nel file bat per chiudere JMP ma non ha aiutato, presumibilmente perché non si arriva mai a quel passaggio.
Ho anche scoperto che avrei potuto rendere felice lo scheduler modificando il file batch in:
avviare "" "C:\Programmi\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl".Quindi non aspetta inutilmente che l'operazione finisca, lo scheduler pensa che sia fatto dopo aver avviato il file .bat, ma ho ancora i processi JMP lasciati aperti.Non riesco ancora a capire come chiudere correttamente JMP quando lo apro nello scheduler.Forse posso eseguire quotidianamente un'attività che interrompe l'attività su tutti i JMP aperti in un'ora strana quando non mi aspetto che venga eseguito nulla di utile.Ma spero in una soluzione più pulita.
qualche idea a riguardo?
Questo è JMP9 e Windows7. E ciò accade con una varietà di script JSL diversi, che sembrano tutti completare le proprie attività fino al punto di uscire da JMP (e uscire da JMP al di fuori dello scheduler).
Ho osservato lo stesso problema descritto. Ma ho trovato una soluzione molto semplice.
Ho notato che quando eseguo JMP in modo interattivo, che quando lo chiudo se ci sono file aperti (ad esempio script), ottengo sempre una finestra di dialogo "Salva sessione" che mi chiede "Vuoi che JMP ricordi i file e i rapporti aperti e riaprirli la prossima volta?"
Sono presenti i pulsanti Sì, No e Annulla e una casella di controllo "Non chiedermi più di salvare la sessione".
Sospettavo che questa finestra di dialogo venisse visualizzata anche in modalità batch e che JMP fosse lì in attesa di una risposta.
Quindi ho selezionato la casella "Non chiedermelo più" e ho chiuso JMP.
Quindi ho attivato manualmente il mio lavoro batch nell'Utilità di pianificazione....e che ne sai, è stato eseguito correttamente e terminato correttamente con "l'operazione completata con successo" annotato nell'Utilità di pianificazione.
Non ho trovato una soluzione alla causa principale del problema.Ma non sei l'unica persona a dirmi che exit() non sempre funziona.Adesso però ho una soluzione alternativa.
Ho dovuto coinvolgere mio marito, un vero programmatore, per questo.Adesso gli devo una torta con crema alla banana.
Questo piccolo programma Powershell risolve in realtà un altro problema specifico di JMP che potrebbe interessare a qualcuno.Uno dei miei script vuole aprire un indirizzo html e ottenere informazioni tabellari da lì.MA la posizione è protetta da password.Non sono riuscito a trovare un modo per consentire a JMP di trasferire le mie credenziali a un sito Web in JSL, semplicemente fallisce.Tuttavia, funziona semplicemente senza le credenziali se ho recentemente aperto il sito e inserito le credenziali in Internet Explorer .JMP sembra utilizzare i cookie di IE.Ad ogni modo, questo è il motivo per cui questo programma ha un'opzione della riga di comando chiamata "loginpage".È superfluo per il problema di uscita di JMP ma facoltativamente apre IE in una determinata pagina Web, passa le credenziali codificate se necessario e quindi chiude IE.
"waitforlog" È rilevante.Il modo in cui funziona questo schema è che quando lo script JMP viene eseguito, al termine dell'esecuzione invia un determinato file di registro.a differenza di exit() questo sembra avvenire in modo affidabile.Questo programma elimina qualsiasi versione precedente di quel file, apre JMP, esegue lo script quindi attende che il file ricompaia.Quando lo fa, sa che può uccidere JMP e ha individuato l'ID del processo dell'istanza di JMP che ha aperto e uccide proprio quell'istanza.
Avevo una soluzione alternativa precedente utilizzando taskkill per uccidere periodicamente tutti i JMP aperti, ma sembra che non sia facile in un semplice file batch sapere quale particolare istanza hai appena avviato in modo da poter uccidere quell'istanza specifica con taskkill.Dato che ho molti lavori pianificati e desidero anche utilizzare questa macchina per aprire JMP ed eseguire un po' di lavoro manuale mentre i lavori vengono eseguiti in background, non era una buona soluzione semplicemente eliminare le istanze JMP, volenti o nolenti.Powershell sembra avere un potere speciale nell'identificare un'istanza specifica di un programma appena avviato.
Ad ogni modo questa soluzione Powershell funziona per me ora, per entrambi i problemi....
Ecco un esempio della sintassi in un file .bat che lo esegue....(con le ultime due cose facoltative)
powershell "&"C:\SCHEDULED\runJMPscript. ps1" -script 'C:\SCHEDULED\yourJSLscript.JSL' -waitforlog -loginpage
Come ho detto, non l'ho scritto io stesso e la parte di accesso si basa su qualcosa che ho trovato in un altro forum sull'avvio di IE e su come fargli fare più cose che erano possibili solo in un semplice file batch.Eppure è abbastanza comprensibile.Tieni presente che la posizione di JMP è codificata lì e dovresti modificare lo script per creare il file di registro con il nome che è il nome dello script con estensione .log.
#**************************************************** ****************************
#
# RunJmpScript.ps1: script PowerShell utilizzato per eseguire un comando Jmp
#
# Utilizzo:
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script nomescript [-waitforlog]
#
#**************************************************** ****************************
param ([switch]$loginpage, [string]$script = "sconosciuto", [switch]$waitforlog)
#
# Controlla la presenza di errori nelle opzioni della riga di comando
#
Write-Host "pagina login: $ pagina login"
Write-Host "script: $script"
Host di scrittura "waitforlog: $ waitforlog"
$scriptexists = (Test-Path $script -PathType Leaf)
se (!($scriptesiste))
{
Write-Host "Errore: è necessario specificare il percorso di un file di script Jmp utilizzando -script "
uscita 1
}
#
# Recupera le informazioni sulla pagina di accesso, se necessario
#
se ($pagina di accesso)
{
# Definisci alcune variabili che cambieranno in base alla tua configurazione
# Raccomando di archiviarli in un file XML e di leggerli durante l'esecuzione
# volta, ma per il bene di questo esercizio lo mantengo semplice.
$username = "inserisci qui il nome utente"
$password = "inserisci qui la password"
$url = "inserisci l'URL qui"
# Crea l'oggetto com di IE
$ie = nuovo-oggetto -com InternetExplorer.Application
# Passare alla pagina di accesso
$ie.naviga($url)
# Attendi il completamento del caricamento della pagina
fai {dormi 1} fino a (-not ($ie.Busy))
#$ie.visible = $true #Rimuovi il commento per il debug
# Assegna il DOM alla variabile $doc
$doc = $ie.document
# Inserisci le informazioni di accesso
Tentativo {
# Trova il campo nome utente e imposta il valore su quello della nostra variabile
$nomeutenteField = $doc.getElementById('UTENTE')
$nomeutenteField.value = $nomeutente
# Trova il campo password e imposta il valore su quello del risultato
# di una chiamata alla funzione get-password con il parametro definito in alto
$passwordField = $doc.getElementById('PASSWORD')
$passwordField.value = $password
# Trova e fai clic sul pulsante di invio
$submitButton = $doc.getElementById('Invia')
$submitButton.click()
# Attendi il completamento dell'accesso
fai {dormi 1} fino a (-not ($ie.Busy))
} prendi {$null}
# Attendi il completamento del caricamento della pagina
fai {dormi 1} fino a (-not ($ie.Busy))
# Chiudi IE
$ie.quit()
}
#
# Rimuove il file di registro corrente se intendiamo monitorarlo
#
$file di registro = $script + ".log"
se ($waitforlog)
{
if (Test-Percorso $logfile -PathType Leaf)
{
Write-Host "Rimozione del file di registro esistente $logfile"
Rimuovi elemento $ file di registro
}
}
#
# Esegue il comando Jmp, utilizzando lo script specificato
#
$exe = "C:\Programmi\SAS\JMP\9\jmp.exe"
$exeargs = "`"" + $script + "`""
Write-Host "Avvio del processo $exe con argomento: $exeargs"
$jmp = processo di avvio $exe "$exeargs" -passthru
#
# Vedi se dobbiamo aspettare questo per scrivere un file di registro.
#
se ($waitforlog)
{
$file di registro = $script + ".log"
$idval = $jmp.Id
Write-Host "In attesa del file di registro $logfile dal processo $idval"
while (!(Test-Path $Logfile -PathType Leaf))
{
# Se il processo termina, possiamo uscire adesso
se ($jmp.HasExited)
{
esci 0
}
# Altrimenti, aspetta un po' e riprova
Inizio-sonno -s 1
}
Write-Host "Arresto del programma esterno $idval"
Arresta processo $idval
}
esci 0
Ho riscontrato problemi simili con l'utilizzo del comando exit(nosave) anche quando utilizzo l'utilità di pianificazione... quando eseguo lo script jsl in JMP, funziona correttamente.
In realtà non l'ho mai visto prima, ma ho ottenuto i seguenti 2 risultati (stesso script, macchine diverse):
1) il programma si chiude come dovrebbe
2) Ricevo una "Eccezione JMP!" finestra di avviso che indica che JMP ha eseguito una violazione di accesso e verrà chiuso.se ciò non è possibile, le informazioni sull'errore verranno copiate in JMPExcept.jer nella cartella Documenti personali o nella cartella dei dati dell'applicazione locale dell'utente.Se necessario, le informazioni sull'errore possono essere inviate tramite posta elettronica al supporto tecnico JMP.
Nel mio caso, ottengo questi risultati anche quando eseguo il file bat, ma quando eseguo normalmente lo script JSL da JMP, funziona sempre.
In realtà ho anche visto dove funziona a volte e non altri sulla stessa macchina.
Se qualcuno ha altre esperienze (o soluzioni alternative), mi piacerebbe sentirne parlare.In realtà ho inviato un'e-mail al supporto JMP e subito non sapevano perché il comportamento fosse diverso.