Bagaimana saya bisa skrip kelelawar atau cmd untuk berhenti dan memulai layanan andal dengan pengecekan kesalahan (atau beri tahu saya bahwa itu tidak berhasil karena alasan apa pun)?
Bagaimana saya bisa skrip kelelawar atau cmd untuk berhenti dan memulai layanan andal dengan pengecekan kesalahan (atau beri tahu saya bahwa itu tidak berhasil karena alasan apa pun)?
Jawaban:
Gunakan perintah SC
(kontrol layanan), ini memberi Anda lebih banyak opsi daripada hanya start
& stop
.
DESKRIPSI: SC adalah program baris perintah yang digunakan untuk berkomunikasi dengan Pengontrol Layanan NT dan layanan. PEMAKAIAN: sc <server> [perintah] [nama layanan] ... Opsi <server> memiliki bentuk "\\ ServerName" Bantuan lebih lanjut tentang perintah dapat diperoleh dengan mengetik: "sc [command]" Perintah: permintaan ----------- Menanyakan status layanan, atau menyebutkan status untuk jenis layanan. queryex --------- Permintaan status diperluas untuk layanan, atau menyebutkan status untuk jenis layanan. mulai ----------- Memulai layanan. jeda ----------- Mengirim permintaan kontrol PAUSE ke layanan. menginterogasi ----- Mengirim permintaan kontrol INTERROGATE ke layanan. lanjutkan -------- Mengirim permintaan kontrol LANJUTKAN ke layanan. berhenti ------------ Mengirim permintaan STOP ke layanan. config ---------- Mengubah konfigurasi layanan (persisten). description ----- Mengubah deskripsi layanan. kegagalan --------- Mengubah tindakan yang diambil oleh layanan setelah kegagalan. qc -------------- Menanyakan informasi konfigurasi untuk layanan. qdescription ---- Menanyakan deskripsi untuk layanan. qfailure -------- Menanyakan tindakan yang dilakukan oleh layanan setelah kegagalan. hapus ---------- Menghapus layanan (dari registri). buat ---------- Membuat layanan. (menambahkannya ke registri). control --------- Mengirim kontrol ke layanan. sdshow ---------- Menampilkan deskriptor keamanan layanan. sdset ----------- Menetapkan deskriptor keamanan layanan. GetDisplayName - Mendapat DisplayName untuk layanan. GetKeyName ------ Mendapat ServiceKeyName untuk layanan. EnumDepend ------ Menghitung Ketergantungan Layanan. Perintah berikut ini tidak memerlukan nama layanan: sc <server> <command> <option> boot ------------ (ok | buruk) Menunjukkan apakah booting terakhir harus disimpan sebagai konfigurasi boot terakhir yang dikenal baik Kunci ------------ Mengunci Database Layanan QueryLock ------- Menanyakan LockStatus untuk Database SCManager CONTOH: sc mulai MyService
net start [serviceName]
dan
net stop [serviceName]
memberi tahu Anda apakah mereka berhasil atau gagal dengan cukup jelas. Sebagai contoh
U:\>net stop alerter
The Alerter service is not started.
More help is available by typing NET HELPMSG 3521.
Jika dijalankan dari file batch, Anda memiliki akses ke ERRORLEVEL dari kode kembali. 0 menunjukkan kesuksesan. Apa pun yang lebih tinggi mengindikasikan kegagalan.
Sebagai file bat, error.bat
:
@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause
Outputnya terlihat seperti ini:
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 . . .
Kembalikan Kode
- 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
Sunting 20.04.2015
Kembali kode:
Perintah NET tidak mengembalikan kode pengembalian kelas Win32_Service yang terdokumentasi (Layanan Tidak Aktif, Timeout Permintaan Layanan, dll.) Dan untuk banyak kesalahan hanya akan mengembalikan Errorlevel 2.
Lihat di sini: http://ss64.com/nt/net_service.html
NET
tidak hanya untuk fungsi layanan terkait sementara SC
ini hanya untuk fungsi layanan terkait.
errorlevel
dikembalikan adalah 2, lihat di sini bagaimana menafsirkan hasil kesalahan .
Anda dapat menggunakan perintah NET START dan kemudian memeriksa variabel lingkungan ERRORLEVEL, misalnya
net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%
Penafian: Saya sudah menulis ini dari atas kepala saya, tetapi saya pikir itu akan berhasil.
Saya telah membuat file batch pribadi saya untuk ini, milik saya sedikit berbeda tetapi merasa bebas untuk memodifikasi sesuai keinginan Anda. Saya membuat ini beberapa waktu yang lalu karena saya bosan dan ingin membuat cara sederhana agar orang dapat memasukkan akhir, mulai, berhenti, atau pengaturan ke otomatis. File BAT ini hanya meminta Anda memasukkan nama layanan dan akan melakukan sisanya untuk Anda. Saya tidak menyadari bahwa dia sedang mencari sesuatu yang menyatakan kesalahan, saya pasti salah membaca bagian itu. Meskipun biasanya ini dapat dilakukan dengan memasukkan >> output.txt pada akhir baris.
% Var% hanyalah cara bagi pengguna untuk dapat memasukkan layanan mereka sendiri ke dalam ini, alih-alih harus memodifikasi file bat setiap kali Anda ingin memulai / menghentikan layanan yang berbeda.
Jika saya salah, siapa pun dapat merasa bebas untuk memperbaiki saya dalam hal ini.
@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
Menggunakan kode kembali dari net start
dan net stop
sepertinya metode terbaik bagi saya. Coba lihat ini: Net Mulai kode pengembalian .
Sintaks selalu membuatku .... jadi ...
Di sini secara eksplisit cara menambahkan baris ke file batch yang akan mematikan layanan jarak jauh (di komputer lain) jika Anda seorang admin di kedua mesin, jalankan .bat sebagai administrator, dan mesin berada di domain yang sama. Nama mesin mengikuti format UNC \ myserver
sc \\ip.ip.ip.ip stop p4_1
Dalam hal ini ... p4_1 adalah Nama Layanan dan Nama Tampilan, saat Anda melihat Properti untuk layanan di Manajer Layanan. Anda harus menggunakan Nama Layanan.
Untuk pecandu Layanan Ops Anda ... pastikan untuk menambahkan kode alasan dan komentar Anda! yaitu '4' yang sama dengan 'Direncanakan' dan komentar 'Menghentikan server untuk pemeliharaan'
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
CMD
sebagai pengguna / ID lain dengan melakukan runas /user:Domain\UserName cmd
lalu masukkan kata sandi Anda. CMD akan mulai berjalan sebagai akun pengguna yang ditentukan.
Kami ingin berpikir bahwa "stop net" akan menghentikan layanan. Sayangnya, kenyataan tidak hitam dan putih. Jika layanan membutuhkan waktu lama untuk berhenti, perintah akan kembali sebelum layanan berhenti. Anda tidak akan tahu, kecuali Anda memeriksa tingkat kesalahan.
Solusinya tampaknya untuk loop mencari kondisi layanan sampai dihentikan, dengan jeda setiap kali putaran loop.
Tapi sekali lagi ...
Saya melihat layanan pertama membutuhkan waktu yang lama untuk berhenti, kemudian "penghentian bersih" untuk layanan selanjutnya tampaknya tidak melakukan apa pun. Lihatlah layanan di manajer layanan, dan kondisinya masih "Memulai" - tidak ada perubahan menjadi "Berhenti". Namun saya dapat menghentikan layanan kedua ini secara manual menggunakan SCM, dan berhenti dalam 3 atau 4 detik.
Saya baru saja menggunakan contoh Jonas di atas dan membuat daftar lengkap 0 hingga 24 tingkat kesalahan. Posting lain benar net start
dan net stop
hanya menggunakan errorlevel
0 untuk sukses dan 2 untuk kegagalan.
Tetapi inilah yang berhasil bagi saya:
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%
Ubah stop
ke start
dan bekerja secara terbalik.
Restart layanan manual ok - service.msc memiliki tombol "Restart", tetapi dalam baris perintah perintah sc dan net tidak memiliki sakelar "restart" dan jika restart dijadwalkan dalam file cmd / bat, layanan dihentikan dan mulai segera, kadang-kadang mendapat kesalahan karena layanan belum berhenti, perlu waktu untuk mematikannya.
Ini dapat menghasilkan kesalahan: sc stop sc start
Adalah ide bagus untuk menyisipkan batas waktu, saya menggunakan ping (ping setiap 1 detik): sc stop ping localhost -n 60 sc start
Berikut adalah perintah Windows 10 untuk memulai Pemulihan Sistem menggunakan batch:
sc config swprv start= Auto
Anda mungkin juga menyukai perintah-perintah itu:
Ubah nilai registri untuk secara otomatis memulai Pemulihan sistem
REG TAMBAHKAN "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f
Buat titik pemulihan sistem
Wmic.exe / Namespace: \ root \ default Path SystemRestore Call CreateRestorePoint "djibe menyelamatkan PC Anda", 100, 12
Ubah Pemulihan Sistem penggunaan disk
vssadmin mengubah ukuran shadowstorage / for = C: / on = C: / maxsize = 10%
Nikmati
Kadang-kadang Anda dapat menemukan berhenti tidak berfungsi ..
SQlServer saya terkadang melakukan ini. Menggunakan baris perintah berikut akan membunuhnya. Jika Anda benar-benar membutuhkan skrip Anda untuk membunuh hal-hal yang tidak berhenti. Saya ingin ini melakukan ini sebagai pilihan terakhir
taskkill /pid [pid number] /f
Saya menulis layanan windows di C #, loop stop / uninstall / build / install / start terlalu melelahkan. Menulis skrip mini, menyebutnya reploy.bat
dan menjatuhkannya di direktori output Visual Studio saya (yang memiliki layanan dibangun yang dapat dieksekusi) untuk mengotomatiskan loop.
Cukup atur 3 vars ini
servicename
: ini muncul di panel kontrol Layanan Windows (services.msc)
slndir
: folder (bukan path lengkap) yang berisi file solution (.sln) Anda
binpath
: path lengkap (bukan path folder) ke layanan yang dapat dieksekusi dari build
CATATAN: Ini perlu dijalankan dari Baris Perintah Pengembang Visual Studio agar msbuild
perintah berfungsi.
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%
Mungkin ini membantu seseorang :)