Je voudrais pouvoir demander si un service s'exécute à partir d'un fichier batch Windows. Je sais que je peux utiliser:
requête sc "ServiceName"
mais, cela vide du texte. Ce que je veux vraiment, c’est qu’elle définisse la variable d’environnement errorlevel
afin que je puisse agir à ce sujet.
Connaissez-vous un moyen simple de le faire?
MISE À JOUR
Merci pour les réponses fournies jusqu'ici. Je crains que les solutions d'analyse du texte ne fonctionnent pas sur des systèmes d'exploitation autres que l'anglais. Est-ce que quelqu'un connaît un moyen de contourner cela, ou vais-je devoir mordre la balle et écrire un programme sur console pour y arriver correctement.
sc query "ServiceName" | find "RUNNING"
Revenons à la vieille école de programmation par lots sur Windows
net start | find "Service Name"
Cela fonctionnera partout ...
si cela ne vous dérange pas de combiner la commande net avec grep, vous pouvez utiliser le script suivant.
@echo off
net start | grep -x "Service"
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:end
Vous pouvez utiliser wmic avec l'option / locale
call wmic /locale:ms_409 service where (name="wsearch") get state /value | findstr State=Running
if %ErrorLevel% EQU 0 (
echo Running
) else (
echo Not running
)
Pensant un peu en dehors de la boîte ici, je vais proposer que Powershell soit une réponse sur les ordinateurs XP/2003 les plus récents et certainement sur Vista/2008 et plus récent (au lieu de .bat/.cmd). Toute personne qui a un peu de Perl dans son arrière-plan devrait se sentir assez rapidement à la maison.
$serviceName = "ServiceName";
$serviceStatus = (get-service "$serviceName").Status;
if ($serviceStatus -eq "Running") {
echo "Service is Running";
}
else {
#Could be Stopped, Stopping, Paused, or even Starting...
echo "Service is $serviceStatus";
}
Si vous avez un investissement important dans le traitement par lots, vous pouvez également exécuter le script PS en une ligne, en renvoyant un code de sortie.
@ECHO off
SET PS=powershell -nologo -command
%PS% "& {if((get-service SvcName).Status -eq 'Running'){exit 1}}"
ECHO.%ERRORLEVEL%
Exécuter en tant que one-liner contourne également la stratégie de signature de code PS par défaut aux dépens de la confusion. Pour placer les commandes PS dans un fichier .ps1 et le lancer comme powershell myCode.ps1
vous constaterez peut-être que la signature de vos scripts powershell est nécessaire pour les exécuter de manière automatisée (dépend de votre environnement). Voir http://www.hanselman.com/blog/SigningPowerShellScripts.aspx pour plus de détails.
Je voudrais suggerer WMIC Service WHERE "Name = 'SericeName'" GET Started
ou WMIC Service WHERE "Name = 'ServiceName'" GET ProcessId
_ (ProcessId sera à zéro si le service n'est pas démarré)
Vous pouvez définir le niveau d'erreur selon que le premier retourne "TRUE" ou que le dernier retourne une valeur différente de zéro
requête sc "nom_service" | findstr ÉTAT
par exemple:
sc requête "wuauserv" | findstr ÉTAT
Pour signaler ce que fait le service de mise à jour Windows, exécuter/suspendre, etc.
Ceci s’applique également à Windows 10. Merci plus tard.
Essayer
sc query state= all
pour une liste de services et s'ils fonctionnent ou non.
@ECHO OFF
REM testing at cmd : sc query "MSSQLSERVER" | findstr RUNNING
REM "MSSQLSERVER" is the name of Service for sample
sc query "MSSQLSERVER" %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo Oh noooo.. trouble mas bro
goto end
:started
echo "SQL Server (MSSQLSERVER)" is started
goto end
:stopped
echo "SQL Server (MSSQLSERVER)" is stopped
echo Starting service
net start "MSSQLSERVER"
goto end
:erro
echo Error please check your command.. mas bro
goto end
:end
J'ai trouvé ceci:
sc query "ServiceName" | findstr RUNNING
semble faire à peu près la bonne chose. Mais, je crains que cela ne soit pas assez généralisé pour fonctionner sur des systèmes d'exploitation non anglais.
SERVICO.BAT
@echo off
echo Servico: %1
if "%1"=="" goto erro
sc query %1 | findstr RUNNING
if %ERRORLEVEL% == 2 goto trouble
if %ERRORLEVEL% == 1 goto stopped
if %ERRORLEVEL% == 0 goto started
echo unknown status
goto end
:trouble
echo trouble
goto end
:started
echo started
goto end
:stopped
echo stopped
goto end
:erro
echo sintaxe: servico NOMESERVICO
goto end
:end
Juste pour ajouter à la liste si vous utilisez Powershell.
sc.exe query "ServiceName" | findstr RUNNING
La commande ci-dessous ne fonctionne pas car sc
est un alias de Set-Content dans Powershell.
sc query "ServiceName" | findstr RUNNING
find
ne fonctionne pas non plus sur Powershell pour une raison inconnue de moi.
sc.exe query "ServiceName" | find RUNNING
J'ai remarqué que personne ne mentionnait l'utilisation d'expressions régulières lors de l'utilisation de Réponses find
/findstr
. Cela peut être problématique pour des services de même nom.
Disons que vous avez deux services, CDPUserSvc
et CDPUserSvc_54530
Si vous utilisez jusqu'à présent la plupart des réponses fournies par find
/findstr
, vous obtiendrez des résultats faussement positifs pour les requêtes CDPUserSvc
uniquement lorsque CDPUserSvc_54530
est en cours d'exécution.
Le /r
et /c
Les commutateurs pour findstr
peuvent nous aider à gérer ce cas d’utilisation, ainsi que le caractère spécial indiquant la fin de la ligne, $
Cette requête ne vérifiera que l'exécution du service CDPUserSvc
et ignorera CDPUserSvc_54530
sc query|findstr /r /c:"CDPUserSvc$"
Utilisez Cygwin Bash avec:
sc query "SomeService" |grep -qo RUNNING && echo "SomeService is running." || echo "SomeService is not running!"
(Assurez-vous que vous avez sc.exe
dans votre chemin.)