<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Veo un hilo anterior sobre esto que es similar...
Mi archivo por lotes tiene el mismo aspecto,
como esto:
"C:\Archivos de programa\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl"
pero ya tengo exit(nosave); al final de mi script (y he cerrado todas las tablas y ventanas).Y, si ejecuto el archivo .bat simplemente haciendo clic en él, abre JMP, ejecuta el script y luego sale como debería.Sólo cuando ejecuto este archivo .bat a través del Programador de tareas algo no está bien.Parece no hacer la salida().El script se ejecuta y hace lo suyo, pero queda un jmp.exe abierto; puedo verlo en el Administrador de tareas, aunque por lo demás es invisible, y la tarea no avanza (el programador no dice que esté completo, espera). hasta el tiempo máximo establecido y finaliza la tarea). entonces, el efecto es que mis scripts automatizados están haciendo su trabajo, pero con el tiempo se abren cada vez más JMP hasta que aparece un error de memoria (y si miro en el historial del programador, mis trabajos nunca terminan exitosamente, todos terminan después de una hora o lo que sea).Intenté usar tskill en el archivo bat para cerrar JMP pero eso no ayudó, presumiblemente porque nunca llega a ese paso.
También descubrí que podía hacer feliz al programador modificando el archivo por lotes a:
inicio "" "C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl".Entonces no espera infructuosamente a que termine la cosa, el programador cree que está hecho después de iniciar el archivo .bat, pero todavía tengo procesos JMP abiertos.Todavía no puedo entender cómo cerrar JMP exitosamente cuando lo abro en el programador.Tal vez pueda ejecutar diariamente una tarea que simplemente elimine la tarea en todos los JMP abiertos en alguna hora extraña cuando no espero que se esté ejecutando nada útil.Pero espero una solución más limpia.
¿Alguna idea sobre esto?
Estos son JMP9 y Windows7. Y sucede con una variedad de scripts JSL diferentes, todos los cuales parecen completar sus tareas hasta el punto de salir de JMP (y salen de JMP fuera del programador).
He observado el mismo problema que se ha descrito. Pero encontré una solución muy simple.
Me di cuenta de que cuando ejecuto JMP de forma interactiva, cuando lo cierro y si hay algún archivo abierto (por ejemplo, scripts), siempre aparece un cuadro de diálogo "Guardar sesión" que me pregunta "¿Quieres que JMP recuerde los archivos e informes abiertos?". y volver a abrirlos la próxima vez?"
Hay botones Sí, No y Cancelar y una casilla de verificación para "No volver a preguntarme sobre cómo guardar la sesión".
Sospeché que este cuadro de diálogo también aparece en modo por lotes y que JMP está esperando una respuesta.
Así que marqué la casilla "No volver a preguntarme" y cerré JMP.
Luego activé manualmente mi trabajo por lotes en el Programador de tareas... y qué sabes, se ejecutó exitosamente y finalizó correctamente con "la operación se completó exitosamente" anotado en el programador de tareas.
No he encontrado una solución de causa raíz al problema.Pero no eres la única persona que me dice que exit() no siempre funciona.Sin embargo, ahora tengo una solución alternativa.
Tuve que contratar a mi marido, un verdadero programador, para esto.Ahora le debo una tarta de crema de plátano.
Este pequeño programa Powershell en realidad resuelve otro problema específico de JMP que puede ser de interés para alguien.Uno de mis scripts quiere abrir una dirección html y obtener información tabular desde allí.PERO, la ubicación está protegida con contraseña.No pude encontrar una manera para que JMP pasara mis credenciales a un sitio web en JSL, simplemente falla.Sin embargo, simplemente funciona sin las credenciales. si recientemente abrí el sitio e ingresé las credenciales en Internet Explorer .JMP parece utilizar las cookies de IE.De todos modos, esa es la razón por la que este programa tiene una opción de línea de comando llamada "página de inicio de sesión".Es superfluo para el problema de salida de JMP, pero opcionalmente abre IE en una determinada página web, pasa las credenciales codificadas si es necesario y luego cierra IE.
"waitforlog" ES relevante.La forma en que funciona este esquema es que cuando se ejecuta el script JMP, publica un determinado archivo de registro al final cuando finaliza.a diferencia de exit() esto parece ocurrir de manera confiable.Este programa elimina cualquier versión anterior de ese archivo, abre JMP, ejecuta el script y luego espera a que vuelva a aparecer el archivo.Cuando lo hace, sabe que puede eliminar JMP y ha calculado la identificación del proceso de la instancia de JMP que abrió y elimina solo esa instancia.
Tuve una solución anterior usando taskkill para eliminar periódicamente todos los JMP abiertos, pero parece que no es fácil en un archivo por lotes simple saber qué instancia en particular acaba de iniciar para poder eliminar esa instancia específica con taskkill.Como tengo muchos trabajos programados y también quiero usar esta máquina para abrir JMP y hacer algo de trabajo manual mientras los trabajos se ejecutan en segundo plano, no fue una muy buena solución simplemente eliminar instancias de JMP de cualquier manera.Powershell parece tener un poder especial para identificar una instancia específica de un programa que acaba de iniciar.
De todos modos, esta solución Powershell me funciona ahora, para ambos problemas...
Aquí hay un ejemplo de la sintaxis en un archivo .bat ejecutándolo... (con las dos últimas cosas opcionales)
powershell "&"C:\SCHEDULED\runJMPscript. ps1" -script 'C:\SCHEDULED\yourJSLscript.JSL' -waitforlog -loginpage
Como dije, no escribí esto yo mismo y la parte de inicio de sesión se basa en algo que encontré en otro foro sobre cómo iniciar IE y cómo hacer más cosas que eran posibles con solo un simple archivo por lotes.Aún así, es bastante comprensible.Tenga en cuenta que la ubicación de JMP está codificada allí y deberá modificar su secuencia de comandos para que cree el archivo de registro con el nombre del script con extensión .log.
#*************************************************** ****************************
#
# RunJmpScript.ps1: script de PowerShell utilizado para ejecutar un comando Jmp
#
# Uso:
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script scriptname [-waitforlog]
#
#*************************************************** ****************************
parámetro ([cambiar]$página de inicio de sesión, [cadena]$script = "desconocido", [cambiar]$waitforlog)
#
# Verifique las opciones de la línea de comando para ver si hay errores
#
Write-Host "página de inicio de sesión: $ página de inicio de sesión"
Escritura-Host "script: $script"
Host de escritura "waitforlog: $waitforlog"
$scriptexists = (Test-Path $script -PathType Hoja)
si (!($scriptexists))
{
Write-Host "Error: debe especificar la ubicación de un archivo de script Jmp usando -script "
salida 1
}
#
# Recuperar la información de la página de inicio de sesión si es necesario
#
si ($página de inicio de sesión)
{
# Defina algunas variables que cambiarán según su configuración
# Recomiendo almacenarlos en un archivo XML y leerlos durante la ejecución
# vez, pero por el bien de este ejercicio lo mantendré simple.
$nombredeusuario = "escriba el nombre de usuario aquí"
$contraseña = "escriba la contraseña aquí"
$url = "rellene la URL aquí"
# Crea el objeto com IE
$ie = nuevo-objeto -com InternetExplorer.Aplicación
# Navega a la página de inicio de sesión
$es decir.navigate($url)
# Espere a que la página termine de cargarse
haz {dormir 1} hasta (-no ($es decir.Ocupado))
#$ie.visible = $true #Descomentar esto para depurar
# Asignar el DOM a la variable $doc
$doc = $es decir.documento
# Complete la información de inicio de sesión
intentar {
# Busque el campo de nombre de usuario y establezca el valor al de nuestra variable
$camponombredeusuario = $doc.getElementById('USUARIO')
$nombredeusuarioField.valor = $nombre de usuario
# Busque el campo de contraseña y establezca el valor al del resultado
# de una llamada a la función get-password con el parámetro definido en la parte superior
$contraseñaField = $doc.getElementById('CONTRASEÑA')
$contraseñaField.valor = $contraseña
# Busque y haga clic en el botón enviar
$submitButton = $doc.getElementById('Enviar')
$enviarBotón.hacer clic()
# Espere hasta que se complete el inicio de sesión
haz {dormir 1} hasta (-no ($es decir.Ocupado))
} capturar {$null}
# Espere a que la página termine de cargarse
haz {dormir 1} hasta (-no ($es decir.Ocupado))
# Cerrar IE
$es decir.quit()
}
#
# Elimina el archivo de registro actual si vamos a monitorearlo
#
$archivo de registro = $script + ".log"
si ($waitforlog)
{
if (ruta de prueba $archivo de registro -tipo de ruta hoja)
{
Write-Host "Eliminando el archivo de registro existente $logfile"
Eliminar elemento $logfile
}
}
#
# Ejecute el comando Jmp, usando el script especificado
#
$exe = "C:\Archivos de programa\SAS\JMP\9\jmp.exe"
$exeargs = "`"" + $script + "`""
Write-Host "Iniciando proceso $exe con argumento: $exeargs"
$jmp = iniciar-proceso $exe "$exeargs" -passthru
#
# Veamos si necesitamos esperar a que esto escriba un archivo de registro.
#
si ($waitforlog)
{
$archivo de registro = $script + ".log"
$idval = $jmp.Id.
Write-Host "Esperando el archivo de registro $logfile del proceso $idval"
while (!(Test-Path $Logfile -PathType Hoja))
{
# Si el proceso sale, podemos salir ahora
si ($jmp.HasSalido)
{
salir 0
}
# De lo contrario, espera un poco y vuelve a intentarlo.
Inicio-Sueño -s 1
}
Write-Host "Deteniendo el programa externo $idval"
Detener proceso $idval
}
salir 0
También he tenido problemas similares al usar el comando exit(nosave) cuando uso el programador de tareas... cuando ejecuto el script jsl en JMP, funciona bien.
En realidad, no lo había visto cerrado antes, pero obtuve los siguientes 2 resultados (mismo script, diferentes máquinas):
1) el programa se cierra como se supone que debe hacerlo
2) Recibo una "¡Excepción JMP!" ventana de alerta que dice que JMP ha cometido una infracción de acceso y se cerrará.La información del error se copiará a JMPExcept.jer en la carpeta Mis documentos o en la carpeta de datos de la aplicación local del usuario si esto no es posible.La información del error se puede enviar por correo electrónico al soporte técnico de JMP si es necesario.
En mi caso, también obtengo estos resultados cuando ejecuto el archivo bat, pero cuando ejecuto el script JSL normalmente desde JMP, funciona siempre.
De hecho, también he visto dónde funciona a veces y otras no en la misma máquina.
Si alguien tiene otras experiencias (o soluciones alternativas), me gustaría conocerlas.De hecho, envié un correo electrónico al soporte de JMP y de repente no sabían por qué el comportamiento era diferente.