<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je vois un sujet précédent à ce sujet qui est similaire...
Mon fichier batch est le même,
comme ça:
"C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl"
mais j'ai déjà exit(nosave); à la fin de mon script (et j'ai fermé toutes les tables et fenêtres).Et si j'exécute le fichier .bat simplement en cliquant dessus, il ouvre JMP, exécute le script puis se ferme comme il se doit.Ce n'est que lorsque j'exécute ce fichier .bat via le Planificateur de tâches que quelque chose ne va pas.Il semble que la sortie() ne soit pas effectuée.Le script s'exécute et fait son travail mais un jmp.exe reste ouvert - je peux le voir dans le Gestionnaire des tâches bien qu'il soit autrement invisible, et la tâche ne continue pas (le planificateur ne dit pas qu'elle est terminée, il attend jusqu'au temps maximum défini et termine la tâche). donc l'effet est que mes scripts automatisés font leur travail mais au fil du temps, de plus en plus de JMP sont ouverts jusqu'à ce que j'obtienne une erreur de mémoire (et si je regarde dans l'historique du planificateur, mes tâches ne se terminent jamais correctement, elles sont toutes terminées après une heure ou peu importe).J'ai essayé d'utiliser tskill dans le fichier bat pour fermer JMP mais cela n'a pas aidé, probablement parce qu'il n'atteint jamais cette étape.
J'ai également découvert que je pouvais faire plaisir au planificateur en modifiant le fichier batch pour :
démarrez "" "C:\Program Files\SAS\JMP\9\jmp.exe" "C:\SCHEDULED\MYSCRIPT.jsl".Ensuite, il n'attend pas inutilement la fin de l'opération, le planificateur pense que c'est terminé après le démarrage du fichier .bat, mais j'ai toujours des processus JMP ouverts.Je n'arrive toujours pas à comprendre comment fermer JMP avec succès lorsque je l'ouvre dans le planificateur.Peut-être que je peux exécuter quotidiennement une tâche qui tue simplement tous les JMP ouverts à une heure impaire où je ne m'attends pas à ce que quelque chose d'utile soit exécuté.Mais j'espère une solution plus propre.
des idées à ce sujet ?
Il s'agit de JMP9 et Windows7. Et cela se produit avec une variété de scripts JSL différents, qui semblent tous terminer leurs tâches jusqu'au point de quitter JMP (et quittent JMP en dehors du planificateur).
J'ai observé le même problème que celui décrit. Mais j'ai trouvé une solution très simple.
J'ai remarqué que lorsque j'exécute JMP de manière interactive, lorsque je le ferme s'il y a des fichiers ouverts (par exemple des scripts), j'obtiens toujours une boîte de dialogue "Enregistrer la session" qui me demande "Voulez-vous que JMP se souvienne des fichiers et des rapports ouverts". et les rouvrir la prochaine fois ?"
Il y a des boutons Oui, Non et Annuler ainsi qu'une case à cocher "Ne plus me demander de sauvegarder la session".
Je soupçonnais que cette boîte de dialogue apparaît également en mode batch et que JMP attend une réponse.
J'ai donc coché la case "Ne plus me demander" et fermé JMP.
Ensuite, j'ai déclenché manuellement mon travail par lots dans le Planificateur de tâches... et que savez-vous, il s'est exécuté avec succès et s'est terminé correctement avec "l'opération terminée avec succès" notée dans le planificateur de tâches.
Je n'ai pas trouvé de solution à la cause profonde du problème.Mais vous n'êtes pas le seul à me dire que exit() ne fonctionne pas toujours.Cependant, j'ai une solution de contournement maintenant.
J'ai dû faire appel à mon mari, un vrai programmeur, pour cela.Maintenant, je lui dois une tarte à la crème de banane.
Ce petit programme Powershell résout en fait un autre problème spécifique à JMP qui pourrait intéresser quelqu'un.Un de mes scripts souhaite ouvrir une adresse HTML et obtenir des informations tabulaires à partir de là.MAIS, l'emplacement est protégé par mot de passe.Je n'ai pas trouvé de moyen pour JMP de transmettre mes informations d'identification à un site Web en JSL, cela échoue tout simplement.Cependant, cela fonctionne sans les informations d'identification si j'ai récemment ouvert le site et saisi les informations d'identification dans Internet Explorer .JMP semble utiliser les cookies IE.Quoi qu'il en soit, c'est la raison pour laquelle ce programme dispose d'une option de ligne de commande appelée « page de connexion ».C'est superflu pour le problème de sortie de JMP, mais il ouvre éventuellement IE sur une certaine page Web, transmet les informations d'identification codées en dur si nécessaire, puis ferme IE.
"waitforlog" EST pertinent.La façon dont ce schéma fonctionne est que lorsque le script JMP s'exécute, il publie un certain fichier journal à la fin une fois l'opération terminée.contrairement à exit(), cela semble se produire de manière fiable.Ce programme supprime toute version précédente de ce fichier, ouvre JMP, exécute le script puis attend que le fichier réapparaisse.Lorsqu'il le fait, il sait qu'il peut tuer JMP et il a déterminé l'identifiant de processus de l'instance de JMP qu'il a ouverte et tue uniquement cette instance.
J'ai déjà eu une solution de contournement utilisant taskkill pour tuer périodiquement tous les JMP ouverts, mais il semble qu'il ne soit pas facile dans un simple fichier batch de savoir quelle instance particulière vous venez de démarrer afin de pouvoir tuer cette instance spécifique avec taskkill.Étant donné que j'ai de nombreuses tâches planifiées et que je souhaite également utiliser cette machine pour ouvrir JMP et effectuer des travaux manuels pendant que les tâches s'exécutent en arrière-plan, ce n'était pas une très bonne solution de simplement supprimer les instances JMP bon gré mal gré.Powershell semble avoir un pouvoir spécial pour identifier une instance spécifique d'un programme que vous venez de démarrer.
Quoi qu'il en soit, cette solution Powershell fonctionne pour moi maintenant, pour les deux problèmes....
Voici un exemple de la syntaxe dans un fichier .bat qui l'exécute... (avec les deux dernières choses facultatives)
powershell "&"C:\SCHEDULED\runJMPscript. ps1" -script 'C:\SCHEDULED\votreJSLscript.JSL' -waitforlog -loginpage
Comme je l'ai dit, je n'ai pas écrit ceci moi-même et la partie connexion est basée sur quelque chose que j'ai trouvé dans un autre forum sur le démarrage d'IE et lui permettant de faire plus de choses qui étaient possibles dans un simple fichier batch.C'est quand même assez compréhensible.Notez que l'emplacement de JMP y est codé en dur et que vous devrez modifier votre script pour lui faire créer le fichier journal avec le nom qui est le nom du script avec l'extension .log.
#*************************************************** ****************************
#
# RunJmpScript.ps1 - Script PowerShell utilisé pour exécuter une commande Jmp
#
# Utilisation :
#
# powershell.exe RunJmpScript.ps1 [-loginpage] -script nom du script [-waitforlog]
#
#*************************************************** ****************************
param ([switch]$loginpage, [string]$script = "inconnu", [switch]$waitforlog)
#
# Vérifiez les options de ligne de commande pour les erreurs
#
Write-Host "page de connexion : $page de connexion"
Écrire-Hôte "script : $script"
Hôte d'écriture "waitforlog : $waitforlog"
$scriptexiste = (Test-Path $script -PathType Leaf)
si (!($scriptexiste))
{
Write-Host "Erreur : il faut spécifier l'emplacement d'un fichier de script Jmp à l'aide de -script "
sortie 1
}
#
# Récupérez les informations de la page de connexion si nécessaire
#
si ($page de connexion)
{
# Définissez certaines variables qui changeront en fonction de votre configuration
# Je recommande de les stocker dans un fichier XML et de les lire lors de l'exécution
# fois, mais pour le bien de cet exercice, je reste simple.
$username = "renseignez le nom d'utilisateur ici"
$password = "remplissez le mot de passe ici"
$url = "remplissez l'URL ici"
# Créer l'objet IE com
$ie = nouvel-objet -com InternetExplorer.Application
# Accédez à la page de connexion
$ie.navigate($url)
# Attendez que la page finisse de se charger
faire {sleep 1} jusqu'à (-not ($ie.Busy))
#$ie.visible = $true #Décommentez ceci pour le débogage
# Assignez le DOM à la variable $doc
$doc = $ie.document
# Remplissez les informations de connexion
essayer {
# Recherchez le champ du nom d'utilisateur et définissez la valeur sur celle de notre variable
$usernameField = $doc.getElementById('USER')
$nom d'utilisateurField.value = $nom d'utilisateur
# Recherchez le champ du mot de passe et définissez la valeur sur celle du résultat
# d'un appel à la fonction get-password avec le paramètre défini en haut
$passwordField = $doc.getElementById('MOT DE PASSE')
$passwordField.value = $mot de passe
# Recherchez et cliquez sur le bouton Soumettre
$submitButton = $doc.getElementById('Soumettre')
$submitButton.click()
# Attendez que la connexion soit terminée
faire {sleep 1} jusqu'à (-not ($ie.Busy))
} attraper {$null}
# Attendez que la page finisse de se charger
faire {sleep 1} jusqu'à (-not ($ie.Busy))
# Fermer Internet Explorer
$ie.quit()
}
#
# Supprimez le fichier journal actuel si nous voulons le surveiller
#
$fichier journal = $script + ".log"
si ($waitforlog)
{
si (Test-Path $logfile -PathType Leaf)
{
Write-Host "Suppression du fichier journal existant $logfile"
Supprimer l'élément $logfile
}
}
#
# Exécuter la commande Jmp, en utilisant le script spécifié
#
$exe = "C:\Programmes\SAS\JMP\9\jmp.exe"
$exeargs = "`"" + $script + "`""
Write-Host "Démarrage du processus $exe avec argument : $exeargs"
$jmp = démarrage du processus $exe "$exeargs" -passthru
#
# Voyez si nous devons attendre que cela écrive un fichier journal.
#
si ($waitforlog)
{
$fichier journal = $script + ".log"
$idval = $jmp.Id
Write-Host "En attente du fichier journal $logfile du processus $idval"
while (!(Test-Path $Logfile -PathType Leaf))
{
# Si le processus se termine, nous pouvons simplement quitter maintenant
si ($jmp.HasExited)
{
sortie 0
}
# Sinon, attendez un peu et réessayez
Démarrer-Sommeil -s 1
}
Write-Host "Arrêt du programme externe $idval"
Arrêter le processus $idval
}
sortie 0
J'ai également rencontré des problèmes similaires lors de l'utilisation de la commande exit(nosave) lors de l'utilisation du planificateur de tâches... lorsque j'exécute le script jsl dans JMP, cela fonctionne correctement.
Je ne l'ai jamais vu de près auparavant, mais j'ai obtenu les 2 résultats suivants (même script, machines différentes) :
1) le programme se ferme comme il est censé le faire
2) Je reçois une « Exception JMP ! » fenêtre d'alerte indiquant que JMP a effectué une violation d'accès et va s'arrêter.les informations d'erreur seront copiées dans JMPExcept.jer dans le dossier Mes documents ou dans le dossier de données d'application locale de l'utilisateur si cela n'est pas possible.Les informations sur l'erreur peuvent être envoyées par courrier électronique au support technique de JMP si nécessaire.
Dans mon cas, j'obtiens également ces résultats lors de l'exécution du fichier bat, mais lorsque j'exécute normalement le script JSL à partir de JMP, cela fonctionne à chaque fois.
J'ai aussi vu où cela fonctionnait parfois et pas d'autres sur la même machine.
Si quelqu'un a d'autres expériences (ou solutions), j'aimerais en entendre parler.J'ai en fait envoyé un e-mail au support JMP et d'emblée, ils ne savaient pas pourquoi le comportement était différent.