comment vérifier le script vbs dans Windows est en cours d’exécution ou non?

J’ai créé un script vbs dans Windows …. Je vais exécuter ce script pour obtenir la taille d’un fichier.

J’ai fait ça pour toujours. (même cela est mon exigence).

Mais je devrais savoir est-il en cours d’exécution ou arrêté?

Mais j’ai besoin de vérifier si elle fonctionne ou non ???

D’où je peux vérifier ça ???

------ Exact Script starts here ----- Set FSO = CreateObject("Scripting.FileSystemObject") Set FSO_check=CreateObject("Scripting.FileSystemObject") do while infiniteLoop=0 ----- This code is lasting for ever ---- Loop 

Suis-je clair dans mes ques?

Que diriez-vous d’utiliser la propriété de ligne de commande? Je pense que cela nécessite Windows XP et plus.

Par exemple:

 Set objSWbemServices = GetObject ("WinMgmts:Root\Cimv2") Set colProcess = objSWbemServices.ExecQuery _ ("Select * From Win32_Process where name = 'wscript.exe'") For Each objProcess In colProcess WScript.Echo objProcess.Name, _ objProcess.ProcessId, _ objProcess.CommandLine Next 

La réponse @nimizen n’est pas correcte. Si vous avez un autre script en cours d’exécution, il retournera que votre script est déjà en cours d’exécution.

@h pic réponse est correcte, mais je reçois une erreur avec le tableau “a” dans mes fenêtres. J’ai donc changé un peu et nettoyé pour travailler.

 Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") Set colProcesses = objWMIService.ExecQuery("select * from win32_process where name = 'wscript.exe'") i = 0 For Each objProcess in colProcesses if not (IsNull(objProcess.CommandLine )) then strScriptName = Trim(Right(objProcess.CommandLine,Len(objProcess.CommandLine) - InstrRev(objProcess.CommandLine,"\"))) strScriptName = Left(strScriptName, Len(strScriptName) - 1) if strScriptName = Wscript.ScriptName then i=i+1 end if if i > 1 then 'if > 1 wscript instance 'Wscript.Echo "Duplicate :"&strScriptName&" ." Wscript.Quit end if end if Next 'Wscript.Echo "Pause 2 have 2 scripts running ." 

Hmm, bien d’abord si c’est un script de boucle infinie, alors vous l’utilisez probablement pour vérifier périodiquement un dossier pour faire un travail. Cela semble mauvais mais est généralement moins intense en ressources que le raccordement à WMI pour les notifications. Si c’est opérationnel, son fonctionnement. Le véritable problème est de le distinguer de tous les autres scripts WScript et CScripts en cours d’exécution.

MS Sysinternals Process Explorer http://technet.microsoft.com/en-us/sysinternals/bb896653 vous permet de vous informer sur vos processus en cours. La plupart du temps, je l’utilise pour indiquer, par des arguments de ligne de commande uniques, quel processus de script héberge quel script.

Il n’y a pas de moyen facile de trouver exactement l’identifiant du processus de votre script dans un script. C’est l’une des rares informations d’exécution non exposées dans le modèle d’object de l’environnement de script. Comme vous utilisez déjà l’object du système de fichiers, vous pourriez peut-être chercher un nom de fichier fictif à utiliser comme indicateur de son exécution. Si le script n’a pas pu créer ou ouvrir le fichier, vous pouvez supposer qu’une autre instance du script est déjà en cours d’exécution.

Vous pouvez également créer un autre fichier fictif unique que vous pouvez facilement créer et que votre script supprime automatiquement lors de son exécution. De cette façon, vous créez simplement un fichier vide de ce nom en tant que test et s’il ne disparaît pas en quelques secondes, vous savez qu’aucune instance de votre script n’est en cours d’exécution.

Je pensais aussi que vous pouviez lancer votre script depuis un autre script en utilisant Exec () qui retourne le ProcessID du script lancé, puis relâchez votre référence, stockant le ProcessID où vous en avez besoin pour une utilisation ultérieure.

 Set oExec = WshShell.Exec( "infinite.vbs" ) MyProcessID = oExec.ProcessID ' procID of shell'd program. set oExec = Nothing and do something with MyProcessID 

Puis j’ai remarqué cette annonce

Trouver mon propre identifiant de processus dans VBScript

Qui utilise Exec () pour exécuter un script HTA, obtenir son ProcessID et le rechercher dans WMI, puis utiliser le jeu de résultats de WMI pour localiser le ProcessID du processus parent qui doit être le script effectuant les appels Exec () et WMI. Le problème est que le HTA peut se terminer avant que WMI ait la chance de le trouver.

 Dim iMyPID : iMyPID = GetObject("winmgmts:root\cimv2").Get("Win32_Process.Handle='" & CreateObject("WScript.Shell").Exec("mshta.exe").ProcessID & "'").ParentProcessId 

La plupart du temps, j’ai l’impression que tout cela est exagéré, quelle que soit la raison pour laquelle vous pensez avoir besoin de savoir si le script est en cours d’exécution. Au lieu de cela, concentrez-vous sur l’action “sachant si le processus est en cours d’exécution ou non” vous amène à prendre. Comme cela n’a pas été expliqué, nous ne pouvons pas vraiment vous proposer une stratégie alternative pour y arriver, mais je suis sûr qu’une solution plus simple est disponible. TheFolderSpy http://venussoftcorporation.blogspot.com/2010/05/thefolderspy.html, par exemple, serait une autre manière d’exécuter votre programme sans boucle infinie.

N’oubliez pas d’utiliser une commande de veille dans votre boucle pour permettre aux autres programmes de travailler. Cela fait une grande différence dans l’utilisation des ressources. De plus, vous n’avez besoin que d’une seule instance FSO, rendez-la globale à tout votre code en la créant tôt dans votre script avant toute sous-routine.

Étant donné que vous examinez la taille d’un fichier, vous recherchez probablement des modifications. J’ai trouvé qu’une boucle avec un petit retard WScript.Sleep 200 est bon pour détecter si un fichier est modifié en cours de modification. De cette façon, vous pouvez traiter le fichier au lieu de l’ignorer jusqu’à la prochaine passe de boucle principale qui doit être définie sur 10 secondes ou plus.

J’ai fait un script et au début, je voulais éviter que plusieurs instances / doublons du même processus s’exécutent. Ceci est mon code pour quitter la nouvelle instance au cas où il serait lancé lors de son exécution.
Remarque: cette opération empêche que plusieurs fichiers wscripts ne soient exécutés – empêche simplement le même fichier particulier d’avoir des instances simultanées.

Pour vous adapter à la question initiale, utilisez simplement le bloc qui vérifie les processus en cours d’exécution, si l’un des noms de fichiers wscript est égal au fichier de script que vous recherchez, alors il s’exécute.

 function duplicate_check 'if two scripts get here at the same time - stagger when the generate _ 'the list of running processes _ 'ie - give 1 of them time to close 'else they can both quit leaving no more scripts running call random_script_sleep(2500,500) dim myfilename myfilename = Wscript.ScriptName strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery("select * from win32_process") 'fill arrary w/ all running script names i = 0 For Each objProcess in colProcesses If objProcess.Name = "wscript.exe" Then strScriptName = Trim(Right(objProcess.CommandLine,Len(objProcess.CommandLine) - InstrRev(objProcess.CommandLine,"\"))) strScriptName = Left(strScriptName, Len(strScriptName) - 1) a(i)= strScriptName ' i=i+1 end if Next 'kill script if already running w/ same name if i > 1 then 'if > 1 wscript instance for s = 0 to i if a(s) = myfilename then wscript.quit end if next end if 'sometimes duplicate check fails, if so, write to error log If Err.Number = 1 Then error_notes = " @duplicate check, firstdupcheck(0/1):" & firstdupcheck call error_log error_notes = "error undefined" end if ' if debugmsg = 1 then CreateObject("WScript.Shell").Popup _ ' "found this many scripts: " & i & vbCrlf & _ ' "<>" & i & vbCrlf & _ ' ", 1, "debug popup" end function