Bir sopayı veya cmd'yi bir hizmeti hata denetimi ile güvenilir bir şekilde durdurmak ve başlatmak için nasıl komut dosyası oluşturabilirim (ya da herhangi bir nedenle başarılı olmadığını bana bildirin)?
Bir sopayı veya cmd'yi bir hizmeti hata denetimi ile güvenilir bir şekilde durdurmak ve başlatmak için nasıl komut dosyası oluşturabilirim (ya da herhangi bir nedenle başarılı olmadığını bana bildirin)?
Yanıtlar:
Kullanın SC
(servis kontrol) komutu, bu size sadece çok daha fazla seçenek sunar start
ve stop
.
AÇIKLAMA: SC, iletişim kutusuyla iletişim kurmak için kullanılan bir komut satırı programıdır. NT Hizmet Denetleyicisi ve hizmetleri. KULLANIM: sc <server> [komut] [hizmet adı] ... <server> seçeneği "\\ SunucuAdı" biçiminde Komutlar hakkında daha fazla yardım "sc [command]" yazarak elde edilebilir. Komutlar: query ----------- Bir hizmetin durumunu sorgular veya hizmet türlerinin durumunu listeler. queryex --------- Bir hizmetin genişletilmiş durumunu sorgular veya hizmet türlerinin durumunu listeler. start ----------- Bir hizmet başlatır. pause ----------- Bir servise bir PAUSE kontrol isteği gönderir. interrogate ----- Bir servise INTERROGATE kontrol isteği gönderir. continue -------- Bir servise CONTINUE kontrol isteği gönderir. stop ------------ Bir servise DURDUR isteği gönderir. config ---------- Bir hizmetin yapılandırmasını değiştirir (kalıcı). description ----- Bir hizmetin açıklamasını değiştirir. fail --------- Bir servisin hata üzerine yaptığı işlemleri değiştirir. qc -------------- Bir hizmetin yapılandırma bilgilerini sorgular. qdescription ---- Bir hizmetin açıklamasını sorgular. qfailure -------- Bir hizmetin başarısız olması durumunda gerçekleştirdiği eylemleri sorgular. delete ---------- Bir hizmeti siler (kayıt defterinden). create ---------- Bir hizmet oluşturur. (kayıt defterine ekler). kontrol --------- Bir servise kontrol gönderir. sdshow ---------- Bir hizmetin güvenlik tanımlayıcısını görüntüler. sdset ----------- Bir hizmetin güvenlik tanımlayıcısını ayarlar. GetDisplayName - Bir hizmet için DisplayName değerini alır. GetKeyName ------ Bir hizmet için ServiceKeyName alır. EnumDepend ------ Hizmet Bağımlılıklarını numaralandırır. Aşağıdaki komutlar için bir hizmet adı gerekmez: sc <server> <komut> <seçenek> boot ------------ (ok | bad) Son önyüklemenin gerekip gerekmediğini gösterir son bilinen iyi önyükleme yapılandırması olarak kaydedilebilir Kilitle ------------ Hizmet Veritabanını Kilitler QueryLock ------- SCManager Veritabanı için LockStatus'u sorgular MİSAL: sc MyService'i başlat
net start [serviceName]
ve
net stop [serviceName]
başarılı ya da başarısız olup olmadıklarını anlatırlar. Örneğin
U:\>net stop alerter
The Alerter service is not started.
More help is available by typing NET HELPMSG 3521.
Bir toplu iş dosyasından çalıştırıyorsanız, dönüş kodunun ERRORLEVEL öğesine erişebilirsiniz. 0 başarıyı gösterir. Daha yüksek bir şey başarısızlığı gösterir.
Bir yarasa dosyası olarak error.bat
:
@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause
Çıktı şöyle görünür:
U:\>error.bat
The Alerter service is not started.
More help is available by typing NET HELPMSG 3521.
There was a problem
Press any key to continue . . .
Dönüş Kodları
- 0 = Success
- 1 = Not Supported
- 2 = Access Denied
- 3 = Dependent Services Running
- 4 = Invalid Service Control
- 5 = Service Cannot Accept Control
- 6 = Service Not Active
- 7 = Service Request Timeout
- 8 = Unknown Failure
- 9 = Path Not Found
- 10 = Service Already Running
- 11 = Service Database Locked
- 12 = Service Dependency Deleted
- 13 = Service Dependency Failure
- 14 = Service Disabled
- 15 = Service Logon Failure
- 16 = Service Marked For Deletion
- 17 = Service No Thread
- 18 = Status Circular Dependency
- 19 = Status Duplicate Name
- 20 = Status Invalid Name
- 21 = Status Invalid Parameter
- 22 = Status Invalid Service Account
- 23 = Status Service Exists
- 24 = Service Already Paused
Düzenle 20.04.2015
Dönüş Kodları:
NET komutu belgelenen Win32_Service sınıfı dönüş kodlarını (Hizmet Etkin Değil, Hizmet İsteği Zaman Aşımı, vb.) Döndürmez ve birçok hata için Hata Düzeyi 2'yi döndürür.
Buraya bakın: http://ss64.com/nt/net_service.html
NET
yalnızca hizmetle ilgili işlevler için değil SC
, yalnızca hizmetle ilgili işlevler içindir.
errorlevel
döndürülen 2 olduğundan, hata sonucunun nasıl yorumlanacağına buradan bakın .
NET START komutunu kullanabilir ve ardından ERRORLEVEL ortam değişkenini kontrol edebilirsiniz, örn.
net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%
Feragatname: Bunu kafamın üstünden yazdım, ama bence işe yarayacak.
Bunun için kişisel toplu iş dosyamı oluşturdum, benimki biraz farklı ama uygun gördüğünüzde değiştirmekten çekinmeyin. Bunu biraz önce oluşturdum çünkü sıkıldım ve insanların bitiş, başlatma, durdurma veya otomatik olarak ayarlama girişlerini yapabilmeleri için basit bir yol yapmak istedim. Bu BAT dosyası sadece servis adını girmenizi ister ve gerisini sizin için yapar. Herhangi bir hata bildiren bir şey aradığının farkında değildim, o kısmı yanlış okumalıydım. Yine de bu genellikle satırın sonuna >> output.txt girilerek yapılabilir.
% Var%, farklı bir hizmeti her başlatmak / durdurmak istediğinizde yarasa dosyasını değiştirmek zorunda kalmak yerine, kullanıcının kendi hizmetini buna girebilmesinin bir yoludur.
Eğer yanılıyorsam, kimse beni bu konuda düzeltebilir.
@echo off
set /p c= Would you like to start a service [Y/N]?
if /I "%c%" EQU "Y" goto :1
if /I "%c%" EQU "N" goto :2
:1
set /p var= Service name:
:2
set /p c= Would you like to stop a service [Y/N]?
if /I "%c%" EQU "Y" goto :3
if /I "%c%" EQU "N" goto :4
:3
set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
if /I "%c%" EQU "Y" goto :5
if /I "%c%" EQU "N" goto :6
:5
set /p var2= Service name:
:6
set /p c= Would you like to set a service to auto [Y/N]?
if /I "%c%" EQU "Y" goto :7
if /I "%c%" EQU "N" goto :10
:7
set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto
Dönüş kodları kullanarak net start
ve net stop
bana en iyi yöntem gibi görünüyor. Şuna bir göz atın: Net Start dönüş kodları .
Sözdizimi her zaman beni alır .... yani ...
Her iki makinede de bir yönetici iseniz, .bat'ı yönetici olarak çalıştırın ve makineler aynı etki alanındaysa, bir toplu iş dosyasına uzak bir hizmeti (başka bir makinede) öldürecek bir satırın nasıl ekleneceği açıktır. Makine adı UNC biçimini izliyor \ myserver
sc \\ip.ip.ip.ip stop p4_1
Bu durumda ... Service Manager'da hizmetin özelliklerini görüntülediğinizde p4_1 hem Hizmet Adı hem de Görünen Ad'dı. Hizmet Adını kullanmanız gerekir.
Hizmet Operasyon bağımlıları için ... neden kodunuzu eklediğinizden ve yorum yaptığınızdan emin olun! yani 'Planlanan'a eşit olan' 4 've' Bakım için sunucuyu durdurma '
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
CMD
yaparak diğer kullanıcı / kimlik olarak çalıştırın ve runas /user:Domain\UserName cmd
ardından şifrenizi girin. CMD belirtilen kullanıcı hesabı olarak çalışmaya başlayacaktır.
"Net stop" un hizmeti durduracağını düşünmek isteriz. Ne yazık ki, gerçeklik o kadar siyah ve beyaz değil. Hizmetin durması uzun sürerse, komut hizmet durmadan önce geri döner. Yine de, hata seviyesini kontrol etmezseniz bilemezsiniz.
Çözüm, döngü her seferinde bir duraklama ile, durdurulana kadar hizmetin durumunu aramak için döngü şeklinde dolaşmak gibi görünüyor.
Ama sonra tekrar...
Ben ilk hizmet durdurmak için uzun bir zaman alır görüyorum, sonra bir sonraki hizmet için "net stop" sadece hiçbir şey yapmak gibi görünüyor. Hizmet yöneticisinde servise bakın ve durumu hala "Başlatıldı" - "Durdurma" da değişiklik yok. Yine de bu ikinci servisi SCM kullanarak manuel olarak durdurabilirim ve 3 veya 4 saniye içinde durur.
Yukarıda Jonas'ın örneğini kullandım ve 0 ila 24 hata seviyesinin tam listesini oluşturdum. Diğer gönderi doğrudur net start
ve başarı için net stop
sadece errorlevel
0 ve başarısızlık için 2 kullanın .
Ama bu benim için işe yaradı:
net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%
Değişim stop
için start
ve ters içinde çalışır.
El ile hizmet yeniden başlatma tamam - services.msc "Yeniden Başlat" düğmesine sahiptir, ancak komut satırında hem sc hem de net komutlarında "yeniden başlatma" anahtarı yoktur ve cmd / bat dosyasında yeniden başlatma planlanmışsa, hizmet hemen durdurulur ve bazen başlatılır, bazen Hizmet henüz durdurulmadığı için hata alır, işleri kapatmak için biraz zamana ihtiyaç duyar.
Bu bir hata oluşturabilir: sc stop sc start
Zaman aşımı eklemek iyi bir fikir, ping kullanıyorum (her 1 saniyede ping yapıyor): sc stop ping localhost -n 60 sc start
İşte toplu iş kullanarak Sistem Geri Yükleme'yi başlatmak için Windows 10 komutu:
sc config swprv start= Auto
Bu komutları da beğenebilirsiniz:
Kayıt defteri değerini otomatik başlatma olarak değiştirme Sistem geri yükleme
REG "HKLM \ YAZILIM \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f
Sistem geri yükleme noktası oluşturma
Wmic.exe / Ad alanı: \ root \ default Yol SystemRestore CreateRestorePoint Çağrısı "djibe PC'nizi kaydetti", 100, 12
Sistem Geri Yükleme disk kullanımını değiştirme
vssadmin yeniden boyutlandırma shadowstorage / for = C: / on = C: / maxsize =% 10
Zevk almak
Bazen durağın işe yaramadığını görebilirsiniz ..
Benim SQlServer bazen bunu yapar. Aşağıdaki komut satırını kullanmak onu öldürür. Gerçekten durmayan şeyleri öldürmek için betiğinize ihtiyacınız varsa. Bunu son çare olarak yapardım
taskkill /pid [pid number] /f
C # 'da bir Windows hizmeti yazıyorum, stop / uninstall / build / install / start döngüsü çok yorucu. Mini bir komut dosyası yazdı, adlandırdı reploy.bat
ve döngüyü otomatikleştirmek için Visual Studio çıktı dizinime (yerleşik hizmet çalıştırılabilir bir tane) düştü.
Sadece bu 3 çeşidi ayarlayın
servicename
: bu, Windows Hizmeti kontrol panelinde (services.msc) görünür
slndir
: (tam yol değil) çözümünüzü içeren klasör (.sln)
binpath
: yapıdan çalıştırılabilir hizmetin tam yolu (klasör yolu değil)
Not: Bu msbuild
komutun çalışması için Visual Studio Developer komut satırından çalıştırılması gerekir .
SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%
call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%
Belki bu birine yardımcı olur :)