Saat membuat layanan Windows menggunakan:
sc create ServiceName binPath= "the path"
bagaimana argumen dapat diteruskan ke koleksi Context.Parameters kelas Installer?
Bacaan sc.exe
dokumentasi saya adalah bahwa argumen seperti itu hanya dapat diajukan pada akhir binPath
, tetapi saya belum menemukan contoh atau berhasil melakukan ini.
windows-services
simpatrik greg
sumber
sumber
binPath= "c:\abc\def.exe /Param1=ghi"
sepertinya ide yang tepat. Apakah garis miring terbalik perlu diloloskan (yaitu "c: \\ abc \\ ...")? Hal terburuk, Anda bisa langsung mengedit nilai Registry setelahnya jika SC.EXE tidak bisa melakukannya.Jawaban:
Triknya adalah meninggalkan spasi setelah = dalam pernyataan buat Anda, dan juga menggunakan "" untuk apa pun yang mengandung karakter atau spasi khusus.
Dianjurkan untuk menentukan Nama Tampilan untuk layanan serta mengatur pengaturan mulai ke otomatis sehingga mulai secara otomatis. Anda dapat melakukan ini dengan menentukan
DisplayName= yourdisplayname
danstart= auto
membuat pernyataan.Berikut ini sebuah contoh:
Jika ini berhasil, Anda akan melihat:
PEMBARUAN 1
http://support.microsoft.com/kb/251192
sumber
binPath= "C:\..."
) perlu untuk hadir, atau yang lain ini tidak akan bekerja.start= auto
adalah yang penting, jadi setelah reboot layanan akan dimulai secara otomatis. Sangat bagus jika pengguna akhir bukan ahlibinPath
tanda kutip yang memerlukan tanda kutip, mereka harus melarikan diri (\"
) contoh: jika jalurnyac:\some long path\some.exe "first argument"
harus,binPath= "\"c:\some long path\some.exe\" \"first argument\""
binPath= ...
danDisplayName= ...
; dalam kasus saya, saya lupa "=" setelah DisplayName), maka konsol akan mencetak petunjuk penggunaan untukcreate
perintah; like:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....
etcParameter untuk layanan yang dibuat memiliki beberapa masalah pembentukan khusus, khususnya jika perintah termasuk spasi atau kutipan:
Jika Anda ingin memasukkan parameter baris perintah untuk layanan, Anda harus menyertakan seluruh baris perintah dalam tanda kutip. (Dan selalu meninggalkan tempat setelah
binPath=
dan sebelum kutipan pertama, seperti yang ditunjukkan mrswadge)Jadi, untuk membuat layanan untuk perintah
PATH\COMMAND.EXE --param1=xyz
Anda akan menggunakan parameter binPath berikut:Jika path ke executable berisi spasi , Anda harus menyertakan path dalam tanda kutip.
Jadi untuk sebuah perintah yang memiliki kedua parameter dan jalan dengan spasi, Anda perlu tanda kutip bersarang . Anda harus melarikan diri dari kutipan batin dengan garis miring terbalik \". Hal yang sama berlaku jika parameter itu sendiri mengandung tanda kutip, Anda juga perlu menghindarinya.
Meskipun menggunakan garis miring terbalik sebagai karakter pelarian, Anda tidak perlu melarikan diri garis miring terbalik yang biasa terdapat di jalur. Ini bertentangan dengan bagaimana Anda biasanya menggunakan garis miring terbalik sebagai karakter pelarian.
Jadi untuk perintah seperti
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2
:Ini adalah contoh nyata dari dokumentasi SVNserve, yang memperlihatkan semua kasus khusus:
(linebreak ditambahkan untuk dibaca, jangan termasuk mereka)
Ini akan menambah layanan baru dengan baris perintah
"C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"
.Demikian ringkasannya
binpath=_
,displayname=_
dandepend=_
sumber
binPath= "myservice.exe
. Penerjemah baris perintah harus mengharapkan ini dan membutuhkan perintah untuk menjadi tokenized dengan menggunakan spasi sebagai pembatas.Lihat di sini: Memodifikasi "Path to executable" dari layanan windows
sumber
Saya mengalami masalah dalam menjalankan ini pada Windows 7. Tampaknya mengabaikan argumen pertama yang saya sampaikan sehingga saya menggunakan
binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"
dan berhasil.sumber
Saya gunakan untuk membuatnya tanpa parameter, dan kemudian mengedit registri
HKLM\System\CurrentControlSet\Services\[YourService]
.sumber
Perintah ini berfungsi:
sumber
Penting juga untuk mempertimbangkan bagaimana Anda mengakses Argumen dalam kode aplikasi.
Dalam aplikasi c # saya menggunakan kelas ServiceBase:
Saya mendaftarkan layanan saya menggunakan
sc buat myService binpath = "MeyService.exe arg1 arg2"
Tapi saya tidak bisa mengakses argumen melalui
args
variabel ketika saya menjalankannya sebagai layanan.Dokumentasi MSDN menyarankan tidak menggunakan metode utama untuk mengambil
binPath
atauImagePath
argumen. Sebaliknya itu menyarankan menempatkan logika Anda dalamOnStart
metode dan kemudian menggunakan (C #)Environment.GetCommandLineArgs();
.Untuk mengakses argumen pertama yang
arg1
perlu saya lakukan seperti ini:ini akan mencetak
sumber
Saya menemukan cara untuk menggunakan sc.
sc config binPath = "\" c: \ path dengan spasi di dalamnya \ service_executable.exe \ ""
Dengan kata lain, gunakan \ untuk melarikan diri dari setiap "" Anda ingin selamat dari transit ke dalam registri.
sumber
Contoh pembuatan layanan menggunakan backslash dengan banyak tanda kutip ganda.
sumber
Pastikan Anda memiliki tanda kutip di awal dan akhir dari nilai binPath Anda.
sumber
Saya tidak bisa menangani masalah dengan proposal Anda, pada akhirnya dengan folder x86 itu hanya berfungsi di power shell (windows server 2012) menggunakan variabel lingkungan:
sumber
Jika Anda mencoba semua hal di atas dan masih tidak dapat mengirimkan argumen ke layanan Anda, jika layanan Anda ditulis dalam C / C ++, inilah yang bisa menjadi masalah: ketika Anda memulai layanan Anda melalui "sc start arg1 arg2 ..." , SC memanggil fungsi ServiceMain layanan Anda secara langsung dengan argumen tersebut. Tetapi ketika Windows memulai layanan Anda (saat boot, misalnya), itu fungsi utama layanan Anda (_tmain) yang dipanggil, dengan params dari "binPath" registri.
sumber
itu tidak berfungsi di Powershell dan harus menggunakan CMD dalam kasus saya
sumber