যখন sc.exe দিয়ে কোনও পরিষেবা তৈরি করবেন তখন প্রসঙ্গের পরামিতিগুলিতে কীভাবে পাস করবেন?


143

উইন্ডোজ পরিষেবা তৈরি করার সময়:

sc create ServiceName binPath= "the path"

ইনস্টলার শ্রেণীর প্রসঙ্গটি কীভাবে যুক্তিগুলি পাস করা যেতে পারে?

sc.exeডকুমেন্টেশনের আমার পড়াটি হ'ল এই জাতীয় যুক্তিগুলি কেবল শেষের দিকেই পাস করা যেতে পারে binPathতবে আমি এর উদাহরণ খুঁজে পাইনি বা এটি সফলভাবে করতে সক্ষম হয়েছি।


রেজিস্ট্রিতে পরিষেবাদি কীতে এক নজরে পরামর্শ দেয় যে কোনও প্রয়োজনীয় প্যারামিটারগুলি ইমেজপ্যাথ মান সহ অন্তর্ভুক্ত করা হয়েছে, তাই আপনার binPath= "c:\abc\def.exe /Param1=ghi"সঠিক ধারণা বলে মনে হচ্ছে। ব্যাকস্ল্যাশগুলি কী এড়াতে হবে (অর্থাত "সি: \\ অবসি \\ ...")? সবচেয়ে খারাপ বিষয়, আপনি যদি সরাসরি এস.সি.এক্স.এটি না করতে পারেন তবে রেজিস্ট্রি মানটি সম্পাদন করতে পারেন।
ewall

1
আমি sc.exe ছেড়ে দিয়েছি এবং ইনস্টলটুল.এক্স.ই.এইর মতো ব্যবহার করছি: ইনস্টলটুল.এক্স / সার্ভিসনাম = "থেইনাম" / টার্গেটডির = "সি: \ দ্য ইনস্টলডাইরেক্টরি \" / প্যাকেজরুট = "প্যাকেজ রুটপ্যাথ"
সিমপ্যাট্রিক

আমি ইনস্টলটুল.এক্সি ব্যবহার করেছি এবং পুরানো প্রযুক্তির জন্য আমি উইন্ডোজ এক্সপি / 2003 রিসোর্স কেট থেকে ইনসট্রভ.এক্সি ব্যবহার করি।
গ্যারি কিন্ডেল

উত্তর:


257
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

কৌশলটি হ'ল আপনার তৈরি বিবৃতিতে = এর পরে একটি স্থান ছেড়ে যাওয়া এবং বিশেষ অক্ষর বা শূন্যস্থান সম্বলিত কোনও কিছুর জন্য "" ব্যবহার করা।

সেবার স্বয়ংক্রিয়ভাবে শুরু হওয়া যাতে সেটিংয়ের শুরু সেটিংসটি সেট করার পাশাপাশি পরিষেবার জন্য একটি প্রদর্শন নাম নির্দিষ্ট করার পরামর্শ দেওয়া হয়। আপনি এটি নির্দিষ্ট করে DisplayName= yourdisplaynameএবং start= autoআপনার তৈরি বিবৃতিতে এটি করতে পারেন।

এখানে একটি উদাহরণ:

C:\Documents and Settings\Administrator> sc create asperacentral 
binPath= "C:\Program Files\Aspera\Enterprise Server\bin\Debug\asperacentral.exe" 
DisplayName= "Aspera Central" 
start= auto

এটি যদি কাজ করে তবে আপনার দেখতে হবে:

[SC] CreateService SUCCESS

আপডেট 1

http://support.microsoft.com/kb/251192


39
মনে রাখবেন যে binPath পরে জায়গা = ( binPath= "C:\...") প্রয়োজন উপস্থিত হতে, বা অন্য এই কাজ করবে না।
পেঁয়াজ-নাইট

1
start= autoএকটি গুরুত্বপূর্ণ, তাই পুনরায় বুট করার পরে পরিষেবাটি স্বয়ংক্রিয়ভাবে শুরু হবে। শেষ ব্যবহারকারী যদি বিশেষজ্ঞ না হন তবে খুব ভাল
লাব্রেকা

21
এছাড়াও যদি আপনাকে অতিরিক্ত প্যারামিটারগুলি পাস করার প্রয়োজন হয় যা binPath\"c:\some long path\some.exe "first argument"binPath= "\"c:\some long path\some.exe\" \"first argument\""
उद्धरणগুলির

1
আপনার আরগসগুলিতে "=" এর পরে যদি আপনার কোনও স্থান না থাকে (যেমন binPath= ...এবং DisplayName= ...; আমার ক্ষেত্রে আমি ডিসপ্লে-নেম পরে "=" ভুলে গেছি), তবে কনসোলটি createকমান্ডের জন্য ব্যবহার নির্দেশাবলী মুদ্রণ করবে ; মত: DESCRIPTION: Creates a service entry... USAGE: sc <server> create....ইত্যাদি
লাল মটর

3
"=" এর পরে ফাঁকা স্থানগুলি খুব গুরুত্বপূর্ণ
এরিসোভিভি

152

তৈরি পরিষেবাগুলির জন্য প্যারামিটারগুলিতে কিছু অদ্ভুত বিন্যাস সংক্রান্ত সমস্যা রয়েছে, বিশেষত যদি কমান্ডে ফাঁকা জায়গা বা কোট অন্তর্ভুক্ত থাকে:

আপনি যদি পরিষেবার জন্য কমান্ড লাইন প্যারামিটারগুলি প্রবেশ করতে চান তবে আপনাকে পুরো কমান্ড লাইনটি উদ্ধৃতিতে আবদ্ধ করতে হবে । (এবং binPath=এমসওয়াডজে নির্দেশিত হিসাবে প্রথম উক্তিটির পরে এবং তার আগে সর্বদা একটি স্থান ছেড়ে দিন )

সুতরাং, কমান্ডটির জন্য একটি পরিষেবা তৈরি করতে PATH\COMMAND.EXE --param1=xyz আপনি নিম্নলিখিত বিনপথ প্যারামিটারটি ব্যবহার করবেন:

binPath= "PATH\COMMAND.EXE --param1=xyz"
        ^^                             ^
        ||                             |
  space    quote                     quote

যদি পথ এক্সিকিউটেবল করতে স্পেস রয়েছে , আপনি ঘিরা আছে পথ উদ্ধৃতির মধ্যে।

সুতরাং একটি কমান্ডের জন্য যেখানে উভয় পরামিতি রয়েছে এবং ফাঁকা স্থান রয়েছে, আপনার নেস্টেড উক্তিগুলি দরকার । আপনাকে ব্যাকস্ল্যাশ সহ অভ্যন্তরীণ উক্তিগুলি থেকে বাঁচতে হবে \"। প্যারামিটারগুলিতে যদি কোট থাকে তবে একই হোল্ড রয়েছে, আপনার এগুলিও পালাতে হবে।

এস্কেপ অক্ষর হিসাবে ব্যাকস্ল্যাশগুলি ব্যবহার করা সত্ত্বেও, আপনাকে পথের মধ্যে থাকা নিয়মিত ব্যাকস্ল্যাশগুলি এড়ানোর দরকার নেই। এটি কীভাবে আপনি পালানোর অক্ষর হিসাবে সাধারণত ব্যাকস্ল্যাশ ব্যবহার করেন তার বিপরীত।

সুতরাং যেমন একটি কমান্ড জন্য
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2:

binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"a b c\" --param2"
         ^ ^                 ^           ^                      ^       ^         ^
         | |                 |           |                      |       |         | 
 opening     escaped      regular     escaped                    escaped       closing
   quote     quote       backslash    closing                    quotes          quote
     for     for            in         quote                      for              for
   whole     path          path       for path                  parameter        whole
 command                                                                       command

এখানে এসভিএনজারিভ ডকুমেন্টেশনের একটি দৃ concrete় উদাহরণ দেওয়া হয়েছে, যা সমস্ত বিশেষ ক্ষেত্রে দেখায়:

sc create svnserve 
   binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\"  "
   displayname= "Subversion Server" depend= Tcpip start= auto 

(পাঠযোগ্যতার জন্য লাইন ব্রেকগুলি যুক্ত করা হয়েছে, সেগুলি অন্তর্ভুক্ত করবেন না)

এটি কমান্ড লাইনের সাথে একটি নতুন পরিষেবা যুক্ত করবে "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"

সংক্ষেপে তাই

  • প্রতিটি SC প্যারামিটার পর স্পেস: binpath=_, displayname=_এবংdepend=_
  • প্রতিটি স্ক প্যারামিটারে স্পেস রয়েছে অবশ্যই উদ্ধৃতিতে আবদ্ধ থাকতে হবে
  • বিনপথের ভিতরে থাকা সমস্ত অতিরিক্ত উক্তি ব্যাকস্ল্যাশ সহ পালিয়ে গেছে: \"
  • বিনপথের অভ্যন্তরে থাকা সমস্ত পশ্চাদপদগুলি এড়ানো যায় না

7
আমি পেয়েছি যে এটি নির্ধারণ করা গুরুত্বপূর্ণ ছিল যে বিনপথ = এবং "myservice.exe" মানের মধ্যে একটি স্থান রয়েছে। অর্থাত binPath= "myservice.exe। কমান্ড লাইন ইন্টারপ্রেটার অবশ্যই এটি আশা করে এবং ডিলিমিটার হিসাবে স্পেস ব্যবহার করে কমান্ডটি টোকেনাইজড হয়ে উঠতে হবে।
এমসওয়াডেজে

আমি এইভাবে চেষ্টা করেছি এবং এটি কাজ করেছে। SC.EXE "\\ servername" "SERVICENAME" BinPath = "SampleService.exe" তৈরি করুন
সাঁই

12
sc "" YOURSERVICENAME "বাইনপথ =" \ "সি: \ প্রোগ্রাম ফাইল (x86) \ মাইক্রোসফ্ট এসকিউএল সার্ভার \ এমএসএসকিউএল 11 \ এমএসএসকিউএল \ বিন \ sqlservr.exe \" -সোপিলিটস সুইচ "শুরু = অটো 

এখানে দেখুন: উইন্ডোজ পরিষেবাটির "কার্যকর করার পথে" পরিবর্তন করা হচ্ছে


5

উইন্ডোজ on এ এটির কাজ করতে আমার সমস্যা হয়েছে 7. মনে হয়েছে যে আমি যে প্রথম যুক্তিটি ব্যবহার করেছি তাই binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"এটি ব্যবহার করেছিলাম এবং এটি কাজ করেছিল।


4

আমি এটি কেবল পরামিতি ছাড়াই তৈরি করতে ব্যবহার করি এবং তারপরে রেজিস্ট্রি সম্পাদনা করি HKLM\System\CurrentControlSet\Services\[YourService]


2

এই আদেশটি কাজ করে:

sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto

2

আপনি কীভাবে আবেদনের কোডটিতে আর্গুমেন্টগুলি অ্যাক্সেস করেন তা বিবেচনায় নেওয়াও গুরুত্বপূর্ণ।

আমার সি # অ্যাপ্লিকেশনটিতে আমি সার্ভিসবেস ক্লাসটি ব্যবহার করেছি:

 class MyService : ServiceBase
{

    protected override void OnStart(string[] args)
    {
       }
 }

আমি আমার পরিষেবা ব্যবহার করে নিবন্ধভুক্ত

# মাই সার্ভিস বিনপথ তৈরি করুন = "মাই সার্ভিস.এক্সই আরজি 1 আরজি 2"

আমি argsযখন এটি পরিষেবা হিসাবে চালিত করি তখন আমি ভেরিয়েবলের মাধ্যমে তর্কগুলি অ্যাক্সেস করতে পারি না ।

এমএসডিএন ডকুমেন্টেশনটি যুক্তি binPathবা তর্কগুলি পুনরুদ্ধার করতে প্রধান পদ্ধতিটি ব্যবহার না করার পরামর্শ দেয় ImagePath। পরিবর্তে এটি OnStartপদ্ধতিতে আপনার যুক্তি স্থাপন এবং তারপরে (সি #) ব্যবহার করার পরামর্শ দেয় Environment.GetCommandLineArgs();

প্রথম যুক্তিগুলিতে অ্যাক্সেস করতে arg1আমার এটি করা দরকার:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

                log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]);

       }
 }

এই মুদ্রণ হবে

       arg1 == arg1

আপনি মেইন পদ্ধতিতে আরগ্স প্যারামিটার থেকে আপনার আরগ 1 এবং আরজি 2ও পেতে পারেন।
Wojciech Mikołajewicz

1

আমি স্ক ব্যবহার করার একটি উপায় খুঁজে পেয়েছি।

sc কনফিগারেশন বিনপথ = "\" সি: it এর মধ্যে ফাঁকা স্থান with service_executable.exe \ ""

অন্য কথায়, আপনি রেজিস্ট্রিতে ট্রানজিটটি থেকে বাঁচতে চান এমন কোনও ব্যক্তিকে বাঁচতে use ব্যবহার করুন।


1

অনেক ডাবল উদ্ধৃতি সহ ব্যাকস্ল্যাশ ব্যবহার করার একটি পরিষেবা তৈরির উদাহরণ।

C:\Windows\system32>sc.exe create teagent binpath= "\"C:\Program Files\Tripwire\TE\Agent\bin\wrapper.exe\" -s \"C:\Program Files\Tripwire\TE\Agent\bin\agent.conf\"" DisplayName= "Tripwire Enterprise Agent"

[SC] CreateService SUCCESS

0

আপনার বিনপথ মানটির শুরু এবং শেষের দিকে উদ্ধৃতি অবশ্যই রয়েছে তা নিশ্চিত হন।


1
"C: c abc \ def.exe" একটি পাথ দেওয়া হয়েছে, আমি পরম 1 = "গি" এর মধ্যে এইভাবে পাস করার চেষ্টা করেছি: বিনপথ = "সি: \ অ্যাবসি \ Def.exe / পরম 1 = গি"। তবে কোনও কার্যকর নয় ...
সহানুভূতিশীল

0

আমি আপনার প্রস্তাবগুলি দিয়ে সমস্যাটি হ্যান্ডেল করতে পারিনি, x86 ফোল্ডারটি শেষে এটি কেবল পরিবেশের ভেরিয়েবলগুলি ব্যবহার করে পাওয়ার শেল (উইন্ডোজ সার্ভার 2012) এ কাজ করেছিল:

{sc.exe create svnserve binpath= "${env:programfiles(x86)}/subversion/bin/svnserve.exe --service -r C:/svnrepositories/"   displayname= "Subversion Server" depend= Tcpip start= auto}

0

যদি আপনি উপরোক্ত সমস্ত কিছু চেষ্টা করে থাকেন এবং এখনও আপনার পরিষেবায় আরোগুলি দিতে না পারেন, যদি আপনার পরিষেবাটি সি / সি ++ তে লেখা থাকে তবে সমস্যাটি কী হতে পারে তা এখানে রয়েছে: আপনি যখন "এসসি স্টার্ট আরগ 1 আরজি 2 ..." এর মাধ্যমে আপনার পরিষেবাটি শুরু করেন , এসসি আপনার সেবার সার্ভিস মেইন ফাংশনটিকে সেই আর্গগুলির সাথে সরাসরি কল করে। তবে যখন উইন্ডোজ আপনার পরিষেবাটি শুরু করে (বুট করার সময়, উদাহরণস্বরূপ), এটি আপনার পরিষেবার মূল ফাংশন (_টমেন) বলা হয়, যা রেজিস্ট্রিটির "বিনপ্যাথ" এর প্যারাম সহ।


0

এটি পাওয়ারশেলটিতে কাজ করছে না এবং আমার ক্ষেত্রে সিএমডি ব্যবহার করা উচিত


পাওয়ারশেল 5.1-এ ঠিক করা হয়েছে
ওটিজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.