Taskkill pour tous les processus en cours qui existent dans un répertoire spécifique

2

Je veux fondamentalement combiner les ensembles de commandes suivants. En d'autres termes, je dois vérifier si un fichier exécutable existant dans c: \ apps est en cours d'exécution et, le cas échéant, pour le tuer. Une fois ces commandes terminées, je ferai un robocopy pour mettre à jour les fichiers dans c: \ apps. Ce script sera déployé avec SCCM. Pour cette raison, toutes les commandes doivent renvoyer errorlevel 0, sinon le déploiement sera échoué.

tasklist 2>NUL | find /I /N "processname.exe">NUL
if "%ERRORLEVEL%"=="0" taskkill /f /im processname.exe

et

for /r c:\apps\ %%G in (*.exe) do taskkill /F /IM %%~nxG
Nathan
la source
2
Bienvenue chez SU! Quelle est votre question exactement? Quel problème rencontrez-vous lorsque vous essayez d'atteindre votre objectif?
cʜιᴇ007
N'oubliez pas non plus que, même si un fichier exécutable est appelé launchme.exe, le nom de l'image peut être différent lorsqu'il est en mémoire. launchme.exepeut simplement être un wrapper pour d'autres bibliothèques / exécutables qui doivent être chargés avant que l'interface utilisateur réelle ne soit affichée. En d'autres termes, ne vous fiez pas uniquement au nom de l'exécutable.
JSanchez
En fin de compte, je veux pouvoir copier certains fichiers dans le dossier c: \ apps. Pour ce faire, les exécutables existant dans c: \ apps doivent tous être supprimés. Bon point sur les emballages, mais dans mon cas, ce n'est pas un problème. En outre, la raison pour laquelle je veux le code d'erreur 0 est que le déploiement dans SCCM ne sera pas signalé comme "en échec".
Nathan

Réponses:

1

Je propose quelque chose comme:

WMIC PROCESS WHERE "ExecutablePath comme 'C: \ Apps \ %%'" DELETE

Il y a une apostrophe suivie directement par des guillemets, vous pouvez donc simplement copier et coller cela.

Il ne s’agit donc que d’une simple ligne (plutôt que d’un fichier de commandes).

C'est une technique assez puissante et flexible. Donc, si cela ne fonctionne pas exactement comme ce que vous avez en tête, jouez avec. Il y aura probablement une propriété qui sera propre aux programmes que vous cherchez à supprimer. Un exemple de recherche des détails est disponible à l' adresse suivante : taskkill - termine les tâches avec les titres de fenêtre se terminant par une chaîne spécifique: la réponse de TOOGAM qui présente un scénario assez similaire.

TOOGAM
la source
0

Voir ce travail par lot pour vous.

@echo off

pushd c:\apps
FOR %%A IN (*.exe) do (
tasklist /FI "IMAGENAME eq %%A" 2>NUL | find /I /N "%%A">NUL
if "%ERRORLEVEL%"=="0" taskkill /f /im %%A
)
stderr
la source
1
Il a inclus a / R et %% ~ nxG et ce qu’il a fait là-bas était meilleur. / R examine les sous-répertoires. et pas besoin d'un pushd si vous utilisez l'en-tête de boucle for qu'il avait. Et si vous voulez faire un pushd, vous voudrez peut-être faire un popd. Et s’il veut que tout se termine au niveau d’erreur 0, vous voudrez peut-être faire quelque chose comme dir c:\windows >nulà la fin.
barlop