Je reçois une erreur vraiment frustrante qui survient parfois et parfois elle se déroule sans problème. Mon code est:
function killProcesses(processes) { // A string array of process names. for (i = 0; i < processes.length; i++) { var process = Sys.WaitProcess(processes[i]) if (process.Exists) { // Sometimes the script will crash right here process.Terminate() } }
Depuis que j'ai créé la fonction, j'ai toujours passé exactement les mêmes noms de processus, parfois ils sont démarrés d'autres non, cela n'a jamais été un problème. Mais d'autres fois, il plantera lors de l'exécution et me dira que Object ne prend pas en charge cette propriété ou méthode
. Comme je l'ai dit, cette fonction et la ligne qui l'appelle n'ont jamais été modifiées, donc je ne comprends pas pourquoi cela échoue parfois.
J'ai déjà eu cela dans d'autres parties de mes scripts, donc Je me demande si cela pourrait être lié ou s'il y a simplement quelque chose qui ne va pas dans mon système. Ce qui me déroute vraiment, c'est que Exists
devrait toujours exister sur tout, alors pourquoi n'est-il parfois pas là?
3 Réponses :
Le problème avec ce code est que lorsque vous terminez le premier processus, les index des autres processus sont réduits. Cette version du code est meilleure:
function killProcess(pName) { var p = Sys.WaitProcess(pName, 5000, 1); while (p.Exists) { p.Terminate(); while (p.Exists) Sys.Delay(50); p = Sys.WaitProcess(pName, 5000, 1) } }
Cela ne répond pas à la question de savoir pourquoi .Exists
plante mon script. Si je devais utiliser votre suggestion, il planterait toujours au hasard quand il atteindrait cette ligne.
La méthode J'ai le même problème avec les objets de contrôle que la valeur de résultat de Find Sys.WaitProcess (ProcessName)
doit renvoyer le processus trouvé ou un objet stub vide avec uniquement la propriété Exists
avec une valeur false code > si le processus n'est pas trouvé. Peu importe si le processus est trouvé, il devrait être correct d'utiliser
et elle est répandue pour tous les objets renvoyés par la méthode Exists
pour vérifier si le processus est trouvé. Find
.
J'ai trouvé une solution de contournement:
Si vous accédez à une propriété différente (par exemple Name
) avant d'accéder à Exists
, il n'y a pas d'erreur.
obj.Name; // Add this to prevent error in obj.Exists below: if (obs.Exists) { // Do something here }
Cela ne fonctionne que si les objets sont attendus. Dans mon cas, ils le sont. Si l'objet attendu n'est pas trouvé, obj.Name
lancera une erreur qui est ok comme prévu.
Dans le cas où l'objet peut ne pas être trouvé, vous serait bloqué si Exists
ne fonctionne pas car la valeur du résultat n'est pas nulle ou non vide et obj.Name
lancera une erreur que vous voulez éviter et la seule condition que vous peut vérifier est obj.Exists
.
Cependant, il peut être utile d'essayer de voir si cela fonctionne pour l'objet de processus si le processus est trouvé.
Merci RobC d'avoir créé les noms des méthodes et des propriétés dans des formats de code. C'est mon premier article et j'ai besoin d'apprendre à utiliser les formats de code.
Peut-être que vous pourriez protéger pour null en ayant
Si (processus && processus.Existe)
Je ferais également une boucle depuis le haut juste au cas où l'arrêt du processus affecterait votre liste de processus.